繁体   English   中英

如何使用python正则表达式匹配替代项

[英]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 )和JANEMARY子字符串。 现在,固定的正则表达式匹配:

  • (?s) -DOTALL内联修饰符
  • TOM文字字符序列
  • \\s* -0+空格
  • (.+?) -组1(捕获):直到后继子模式的第一个出现为止,尽可能少的 1+个字符。
  • \\s* -0+空格
  • (?:JANE|MARY) JANEMARY子字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM