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

时间:2018-07-30 01:55:46

标签: python regex

也许我误解了re.finditer的工作原理,但是它似乎忽略了我给它提供的模式并在所有字符实例上都进行了匹配。例如,这段代码:

word = "aaaa"
for match in re.finditer(r"(?<=a)a(?=a)", word):
    word = re.sub(match.group(), "b", word)

在给我"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(如果有的话)。换句话说,如果我尝试线性地应用更改,那么我将回到起点。也许我走错路了?

2 个答案:

答案 0 :(得分:1)

在第一种情况下,两次迭代中/* Quickly aligns the given pointer to a power of two boundary IN BYTES. @return An aligned pointer of typename T. @brief Algorithm is a 2's compliment trick that works by masking off the desired number in 2's compliment and adding them to the pointer. @param pointer The pointer to align. @param boundary_byte_count The boundary byte count that must be an even power of 2. @warning Function does not check if the boundary is a power of 2! */ template <typename T = char> inline T* AlignUp(void* pointer, uintptr_t boundary_byte_count) { uintptr_t value = reinterpret_cast<uintptr_t>(pointer); value += (((~value) + 1) & (boundary_byte_count - 1)); return reinterpret_cast<T*>(value); } struct Foo { Foo () {} }; char buffer[sizeof (Foo) + 64]; Foo* foo = new (AlignUp<Foo> (buffer, 64)) Foo (); 的值为“ a”。 match.group()变成word = re.sub(match.group(), "b", word),自然将每个“ a”替换为“ b”。

在第二个示例中,仅替换了中间的“ a”。

答案 1 :(得分:0)

我在这里找到了想要的答案:Dictionary lookup with key as a matched group in python re.sub module

我没有意识到您可以将函数作为第二个参数传递给sub,因此本质上,您要做的就是将字典查询合并到替代中:

word = re.sub(r"(?<=a).(?=a)", lambda x: d[x.group()], word)