我一直在努力做到以下几点:给出像#" i"这样的字符,找到并替换每对" i"中的第二个。 (没有重叠)。
"I am so irritated with regex. Seriously" -> "I am so rritated wth regex. Seriously".
我几乎找到了使用正面观察的解决方案,但它重叠:(
任何人都可以帮助我吗?
我最好的是(我认为) - &gt; "(?<=i).*?(i)"
答案 0 :(得分:2)
由于后备(?<=i)
,您的regex会匹配重叠的子字符串。您需要为非重叠匹配使用消费模式:
i([^i]*i)
将\1
反向引用替换为使用([^i]*i)
捕获的文本。
请参阅regex demo。
模式匹配:
i
- 文字i
,匹配后,正则表达式索引前进到右(正则表达式引擎默认情况下从左到右处理字符串, re
,没有其他选项),1 char ([^i]*i)
- 这是第1组,匹配除i
以外的0 +字符,直到第一个i
。整个捕获的值在.group(1)
内。匹配后,正则表达式索引在第二个i
匹配且消耗之后与整个模式匹配。因此,当正则表达式引擎继续查找字符串中的剩余匹配时,不会发生重叠匹配。import re
pat = "i"
p = re.compile('{0}([^{0}]*{0})'.format(pat))
test_str = "I am so irritated with regex. Seriously"
result = re.sub(p, r"\1", test_str)
print(result)