为什么python正则表达式搜索方法不一致地正确返回匹配的对象?

2024-04-26 03:25:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一个关于正则表达式课程的练习题:

如果第一个单词是Alice、Bob或Carol;第二个单词是eats、pets或throws;第三个单词是apples、cats或baseballs;句子以句号结尾,那么如何编写与之匹配的正则表达式呢?这个正则表达式应该不区分大小写。它必须符合以下条件:

  • 爱丽丝吃苹果。你知道吗
  • 鲍勃养猫。你知道吗
  • 卡罗尔扔棒球。你知道吗
  • 爱丽丝扔苹果。你知道吗
  • 鲍勃吃猫。你知道吗

我的代码如下:

regex=re.compile(r'Alice|Bob|Carol\seats|pets|throws\sapples\.|cats\.|baseballs\.',re.IGNORECASE)
mo=regex.search(str)
ma=mo.group()

当我传递str ='BOB EATS CATS.''Alice throws Apples.'时,mo.group()只分别返回'Bob''Alice',但我希望它返回整个句子。你知道吗

当我传递str='Carol throws baseballs.'时,mo.group()返回'baseballs.',这是最后一个匹配。你知道吗

我不明白为什么:

  • 对于我传递的前两个str示例,它返回第一个匹配('Bob''Alice'),而我传递的第三个str示例返回最后一个匹配('baseball')?

  • 在所有3个str示例中,我不确定为什么mo.group()不将整个句子作为匹配返回。i、 我期望'Carol throws baseballs.'作为mo.group()

    的输出

Tags: 苹果示例group单词regex句子mobob
2条回答

您需要告诉regex以某种方式对选项列表进行分组,否则它自然会认为这是一个巨大的列表,其中一些元素包含空格。最简单的方法是对每个单词使用捕获组:

regex=re.compile(r'(Alice|Bob|Carol)\s+(eats|pets|throws)\s+(apples|cats|baseballs)\.', re.IGNORECASE)

尾随期不应该是选项的一部分。如果出于某种原因不想使用捕获组(这实际上不会影响匹配的方式),可以改用非捕获组。用(?:...)替换(...)。你知道吗

原始regex被解释为以下一组选项:

  • Alice
  • Bob
  • Carol\seats
  • pets
  • throws\sapples.
  • cats.
  • baseballs.

空间不会神奇地分隔选项。希望您能理解为什么除了baseballs.之外Carol throws baseballs.的元素都不在该列表中。像Carol eats baseballs.这样的东西会匹配Carol eats。你知道吗

你应该把所有的单词分组

您的re应该如下所示:

regex = r'(?:Alice|Bob|Carol)\s(?:eats|pets|throws)\s(?:apples|cats|baseballs)\.'

请注意,我使用(?)?:)而不是(),因为分组仅用于逻辑目的

相关问题 更多 >