如何将替代方案与 python regex 匹配

Amo*_*oso 2 python regex string

给定字符串 1:

'''TOM 喜欢去游泳,MARY 喜欢去游乐场,JANE 喜欢去购物'''

我只想捕获两个名字之间的文本。要么汤姆和玛丽要么汤姆和简。如果 Mary 出现在 Jane 之前,我想捕捉 Tom 和 Mary 之间的文本。但是,如果 Jane 先出现,我想捕获 Tom 和 Jane 之间的文本。

我编写了以下代码:

text = re.compile(r'''(
            TOM\s*
            ([\w\W]+)\s*
            JANE|MARY
            )''', re.VERBOSE)

text_out = text.search(string).group(1)
Run Code Online (Sandbox Code Playgroud)

然而,即使玛丽先出现,这段代码也会给我汤姆和简之间的文本。我明白这是因为管道函数从左到右读取,因此会首先匹配 Jane。有没有办法对此进行编码,使其取决于谁首先出现在文本中?

例如,在字符串 2 中:“'''TOM 喜欢去游泳 JANE 喜欢去购物 MARY 喜欢去游乐场 '''

我想为 string2 捕获 Tom 和 Jane 之间的文本。

Wik*_*żew 6

您需要修复您的交替,它必须用非捕获 group 括起来(?:JANE|MARY),并使用惰性量词 with [\w\W](我将替换为.*并使用re.DOTALL修饰符使点也匹配换行符):

(?s)TOM\s*(.+?)\s*(?:JANE|MARY)
Run Code Online (Sandbox Code Playgroud)

查看正则表达式演示

如果没有(?:...|...),则您的正则表达式匹配Tom,然后匹配任何 1+ 个尽可能多的字符(即,正则表达式抓取整个字符串,然后回溯以匹配后续子模式的最后一次出现,JANE)和JANE,或MARY子字符串。现在,固定的正则表达式匹配:

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