给定字符串1:
“汤姆喜欢去游泳,玛丽喜欢去操场,简喜欢购物。”
我只想捕捉两个名字之间的文字。不是汤姆和玛丽就是汤姆和简。如果玛丽出现在简面前,我想抓住汤姆和玛丽之间的文字。然而,如果简先出现,我想捕捉汤姆和简之间的文字。
我编写了以下代码:
text = re.compile(r'''(
TOM\s*
([\w\W]+)\s*
JANE|MARY
)''', re.VERBOSE)
text_out = text.search(string).group(1)然而,这段代码将给我汤姆和简之间的文本,即使玛丽首先出现。我理解这是因为管道函数从左到右读取,因此将首先匹配Jane。是否有一种方法可以对此进行编码,使其取决于谁首先出现在文本中?
例如,在string2:‘’汤姆喜欢游泳,简喜欢购物,玛丽喜欢去操场‘
我想为string2捕捉汤姆和简之间的文字。
发布于 2017-03-18 19:18:49
您需要修复您的替换,它必须用一个非捕获组(?:JANE|MARY)括起来,并在[\w\W]中使用一个惰性量词(我将用.*替换它,并使用re.DOTALL修饰符来使点也匹配换行符):
(?s)TOM\s*(.+?)\s*(?:JANE|MARY)没有(?:...|...),您的正则表达式匹配Tom,那么任何1+字符都尽可能多(也就是说,regex抓取整个字符串,然后回溯以匹配最后出现的后续子模式JANE)和JANE或MARY子字符串。现在,固定正则表达式匹配:
(?s) - DOTALL内嵌改性剂TOM -文字字符序列\s* - 0+白空间(.+?) -第1组(捕获):任何1+字符,尽可能少的,直到第一次出现后续子模式.\s* - 0+白空间(?:JANE|MARY) - JANE或MARY子字符串。https://stackoverflow.com/questions/42878030
复制相似问题