gpt4 book ai didi

python - 如何将备选方案与 python 正则表达式匹配

转载 作者:行者123 更新时间:2023-12-05 08:56:01 25 4
gpt4 key购买 nike

给定字符串 1:

'''汤姆喜欢去游泳玛丽喜欢去 Playground 简喜欢逛街'''

我只想捕获两个名字之间的文本。要么是汤姆和玛丽,要么是汤姆和简。如果 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)

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

例如,在 string2 中:“'''汤姆喜欢去游泳简喜欢逛街玛丽喜欢去 Playground '''

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

最佳答案

你需要修复你的交替,它必须包含在一个非捕获组 (?:JANE|MARY) 中,并使用惰性量词 [\w\W] (我将替换为 .* 并使用 re.DOTALL 修饰符使点也匹配换行符):

(?s)TOM\s*(.+?)\s*(?:JANE|MARY)

参见 regex demo

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

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

关于python - 如何将备选方案与 python 正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42878030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com