可以说我有一个正则表达式(?:AA|BB)(.*)(?:AA|BB)
,它捕获定界符AA
和BB
我遇到的问题是,这也将匹配 AA...BB
我怎样才能让这个正则表达式只匹配AA...AA
和BB...BB
如果您需要匹配的字符串以相同的前后定界符开头和结尾,则只需捕获前导定界符并在模式本身内部使用反向引用:
(AA|BB)(.*)\1
^ ^ ^^
在Python中,re.finditer
如果只想获取所需的组,就必须使用,而不必re.findall
返回一个元组列表(因此将包含AA
或BB
)。要匹配从子字符串AA
到第一个子字符串AA
,请使用惰性量词*?
:(AA|BB)(.*?)\1
简短的Python演示:
import re
p = re.compile(r'(AA|BB)(.*)\1')
test_str = "AA text AA"
print([x.group(2).strip() for x in p.finditer(test_str)])
# => ['text']
如果您需要使用前导和尾部定界符不匹配的字符串进行匹配,则必须使用alternation:
AA(.*)AA|BB(.*)BB
或-惰性量词版本,以匹配最接近的AA
s和BB
s:
AA(.*?)ZZ|BB(.*?)YY
请注意,这将在结果中输出空元素,因为仅会匹配一组。在大多数Python版本中,如果计划在re.sub
(直到Python 3.5,未匹配的组未使用空字符串(= None)初始化,并且可能引发异常)中使用该模式,则应谨慎使用。
下面是一个提取样本代码与re.finditer
:
import re
p = re.compile(r'(AA)(.*?)(ZZ)|(BB)(.*?)(YY)')
test_str = "AA Text 1 here ZZ and BB Text2 there YY"
print("Contents:")
print([x.group(2).strip() for x in p.finditer(test_str) if x.group(2)])
print([x.group(5).strip() for x in p.finditer(test_str) if x.group(5)])
print("Delimiters:")
print([(x.group(1), x.group(3)) for x in p.finditer(test_str) if x.group(1) and x.group(3)])
print([(x.group(4), x.group(6)) for x in p.finditer(test_str) if x.group(4) and x.group(6)])
结果:
Contents:
['Text 1 here']
['Text2 there']
Delimiters:
[('AA', 'ZZ')]
[('BB', 'YY')]
在现实生活中,使用非常长且复杂的文本,可以展开这些正则表达式以使匹配线性和高效,但这是另一回事。
最后但并非最不重要的一点是,如果您需要将一个定界符中的最短子字符串与其中不包含这些定界符的另一个子字符串进行匹配,请使用经过调节的贪婪标记:
AA((?:(?!AA|ZZ).)*)ZZ|BB((?:(?!BB|YY).)*)YY
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
请参阅regex演示以了解与的区别AA(.*?)ZZ|BB(.*?)YY
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句