我 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/