Python正则表达式 - 查找并替换对中的第二项

时间:2016-04-29 15:17:05

标签: python regex

我一直在努力做到以下几点:给出像#" i"这样的字符,找到并替换每对" i"中的第二个。 (没有重叠)。

"I am so irritated with regex. Seriously" -> "I am so rritated wth regex. Seriously". 

我几乎找到了使用正面观察的解决方案,但它重叠:(

任何人都可以帮助我吗?

我最好的是(我认为) - &gt; "(?<=i).*?(i)"

编辑:我的描述错了。我本来应该替换一对中的第二项,所以结果应该是:&#34;我对正则表达式非常谨慎。 Serously&#34;

1 个答案:

答案 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匹配且消耗之后与整个模式匹配。因此,当正则表达式引擎继续查找字符串中的剩余匹配时,不会发生重叠匹配。

Python demo

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)