python - Python 正则表达式中的上一组匹配

标签 python regex

我 try catch 看起来像 %a 的字符串片段, %b等,并用一些值替换它们。此外,我希望能够逃脱 %通过键入字符 %% .

在示例字符串中 %d%%f%x%%%g我想匹配 <b>%d</b>%%f<b>%x</b>%%<b>%g</b> ( %d%x%g )。

我的正则表达式是这样的:

(?:[^%]|^)(?:%%)*(%[a-z])
  • (?:[^%]|^) - 匹配行首或不同于% 的字符
  • (?:%%)* - 匹配 0 次或多次出现的 %% (转义 % )
  • (%[a-z]) - 与 %a 的正确匹配, %b等模式

添加前两个元素以支持转义%性格。

但是,在示例字符串上运行正则表达式时,最后一个片段 ( %g) 未找到:

>>> import re
>>> pat = re.compile("(?:[^%]|^)(?:%%)*(%[a-z])")
>>> pat.findall("%d%%f%x%%%g")
['%d', '%x']

但是在%%%g之前加了一个字符之后, 它开始正常工作:

>>> pat.findall("%d%%f%x %%%g")
['%d', '%x', '%g']

看起来像x不再与 [^%] 匹配匹配到群组后 (%[a-z]) .如何更改正则表达式以强制它再次检查上一场比赛的最后一个字符?我读到了 \G , 但它没有帮助。

最佳答案

为什么它没有选择 %g

要选择%g,它前面必须有%%。甚至在此之前,它必须有一个 non-% 字符,或者位于字符串的开头。因此,x%%%g 可能会为您匹配。但是这个 x 是在之前的匹配中选择的(即打印 %x 时)。

简单来说,您的正则表达式匹配存在重叠。因此,您可以使用以下方法克服此问题。我将你的正则表达式放在 (?= ... )

pat = re.compile("(?=(?:[^%]|^)(?:%%)*(%[a-z]))")

关于python - Python 正则表达式中的上一组匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22360234/

相关文章:

regex - 前瞻和后向正则表达式

regex - 如何匹配斜杠后的所有内容以用作 nginx 重写?

python - 将字符串中的字符随机替换为当前字符以外的字符

javascript - 获取给定 Angular x 和 y 增量值

python - Pandas 根据其他列上的复合条件添加一列

regex - Notepad++ 正则表达式: Search for long strings which could contain newlines

python - 正则表达式没有字符应该重复

python - 在 mako 模板中拆分变量

regex - 用 sed 替换 Tomcat 中的服务器 header

regex - 如何从差异比较中查找和排除字符串正则表达式文字?