[英]How to match alternatives with python regex
给定字符串1:
'''TOM喜欢游泳MARY喜欢去游乐场JANE喜欢购物'''
我只想捕获两个名称之间的文本。 汤姆和玛丽或汤姆和简。 如果Mary出现在Jane之前,我想捕捉Tom和Mary之间的文本。 但是,如果简首先出现,我想捕捉汤姆和简之间的文字。
我写了以下代码:
text = re.compile(r'''(
TOM\s*
([\w\W]+)\s*
JANE|MARY
)''', re.VERBOSE)
text_out = text.search(string).group(1)
但是,即使玛丽首先出现,此代码也会给我提供Tom和Jane之间的文本。 我知道这是因为管道函数从左到右读取,因此将首先匹配Jane。 有没有一种方法可以对此进行编码,以使其取决于谁首先出现在文本中?
例如,在string2中:“'''TOM喜欢去游泳JANE喜欢去购物MARY喜欢去游乐场'''
我想要捕获Tom和Jane之间的string2文本。
您需要修复替换,它必须包含在一个非捕获组(?:JANE|MARY)
,并使用带有[\\w\\W]
的惰性量词(我将用.*
替换并使用re.DOTALL
使点也与换行符匹配的修饰符):
(?s)TOM\s*(.+?)\s*(?:JANE|MARY)
如果不使用(?:...|...)
,则您的正则表达式匹配Tom
,那么任何1个以上的字符都应尽可能多(即,正则表达式捕获了整个字符串,然后回溯以匹配后续出现的最后一个字符)子模式( JANE
)和JANE
或MARY
子字符串。 现在,固定的正则表达式匹配:
(?s)
-DOTALL内联修饰符 TOM
文字字符序列 \\s*
-0+空格 (.+?)
-组1(捕获):直到后继子模式的第一个出现为止,尽可能少的 1+个字符。 \\s*
-0+空格 (?:JANE|MARY)
JANE
或MARY
子字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.