首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将替代方案与python regex匹配

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

Stack Overflow用户
提问于 2017-03-18 18:09:00
回答 1查看 8.5K关注 0票数 2

给定字符串1:

“汤姆喜欢去游泳,玛丽喜欢去操场,简喜欢购物。”

我只想捕捉两个名字之间的文字。不是汤姆和玛丽就是汤姆和简。如果玛丽出现在简面前,我想抓住汤姆和玛丽之间的文字。然而,如果简先出现,我想捕捉汤姆和简之间的文字。

我编写了以下代码:

代码语言:javascript
复制
text = re.compile(r'''(
            TOM\s*
            ([\w\W]+)\s*
            JANE|MARY
            )''', re.VERBOSE)

text_out = text.search(string).group(1)

然而,这段代码将给我汤姆和简之间的文本,即使玛丽首先出现。我理解这是因为管道函数从左到右读取,因此将首先匹配Jane。是否有一种方法可以对此进行编码,使其取决于谁首先出现在文本中?

例如,在string2:‘’汤姆喜欢游泳,简喜欢购物,玛丽喜欢去操场‘

我想为string2捕捉汤姆和简之间的文字。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-18 19:18:49

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

代码语言:javascript
复制
(?s)TOM\s*(.+?)\s*(?:JANE|MARY)

regex演示

没有(?:...|...),您的正则表达式匹配Tom,那么任何1+字符都尽可能多(也就是说,regex抓取整个字符串,然后回溯以匹配最后出现的后续子模式JANE)和JANEMARY子字符串。现在,固定正则表达式匹配:

  • (?s) - DOTALL内嵌改性剂
  • TOM -文字字符序列
  • \s* - 0+白空间
  • (.+?) -第1组(捕获):任何1+字符,尽可能少的,直到第一次出现后续子模式.
  • \s* - 0+白空间
  • (?:JANE|MARY) - JANEMARY子字符串。
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42878030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档