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 之间的文本。
您需要修复您的交替,它必须用非捕获 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)- 要么JANE或MARY子字符串。| 归档时间: |
|
| 查看次数: |
5983 次 |
| 最近记录: |