[英]Why does re.finditer seem to be ignoring the provided pattern?
也许我误解了re.finditer
工作原理,但是它似乎忽略了我给它提供的模式,并在所有字符实例上都进行了匹配。 例如,此代码:
word = "aaaa"
for match in re.finditer(r"(?<=a)a(?=a)", word):
word = re.sub(match.group(), "b", word)
当我期望它给出"abba"
,给了我"bbbb"
"abba"
,就像下面的代码一样:
word = "aaaa"
word = re.sub(r"(?<=a)a(?=a)", "b", word)
知道为什么通过re.finditer
进行匹配似乎与直接使用re.sub
进行工作有所不同吗?
编辑:为了澄清,我实际上想做的是查找要在字典中应用的替代方法,但是
word = re.sub(r"(?<=a)(a)(?=a)", d[r"\1"], word)
(其中d
是字典)不起作用,因为\\ 1不是键,所以我希望在找到它们时进行迭代并应用替换。 我也不能只为字典中的每个替换单独写一行,因为我有很多圆形的更改,因此a> b,b> c和c> a(如果有的话)。 换句话说,如果我尝试线性地应用更改,那么我将回到起点。 也许我走错路了?
在第一种情况下,两次迭代中match.group()
的值均为“ a”。 word = re.sub(match.group(), "b", word)
变为word = re.sub("a", "b", word)
,自然会将每个“ a”替换为“ b”。
在第二个示例中,仅替换中间的“ a”。
我在这里找到了想要的答案: 在python re.sub模块中将关键字作为匹配组进行字典查找 。
我没有意识到您可以将函数作为第二个参数传递给sub
,因此本质上,您要做的就是将字典查询合并到替换中:
word = re.sub(r"(?<=a).(?=a)", lambda x: d[x.group()], word)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.