繁体   English   中英

为什么re.finditer似乎忽略了所提供的模式?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM