首页 > 解决方案 > 为什么 python 正则表达式搜索方法不能始终正确地返回匹配的对象?

问题描述

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

你将如何编写一个匹配第一个单词是 Alice、Bob 或 Carol 的句子的正则表达式?第二个词要么是吃,要么是宠物,要么是扔;第三个词是苹果、猫或棒球;句子以句号结尾?此正则表达式应该不区分大小写。它必须符合以下条件:

我的代码如下:

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.'or'Alice throws Apples.'时,mo.group()只返回'Bob'or 'Alice',但我期待它返回整个句子。

当我通过str='Carol throws baseballs.'时,mo.group()返回'baseballs.',这是最后一场比赛。

我很困惑为什么:

标签: pythonregexpython-3.xregex-group

解决方案


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

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

尾随期间不应成为选项的一部分。如果您出于某种原因不想使用捕获组(它不会真正影响匹配的方式),您可以改用非捕获组。替换(...)(?:...)

您的原始正则表达式被解释为以下一组选项:

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

空格不会神奇地分隔选项。希望您能明白为什么该列表中不存在Carol throws baseballs.除之外的任何元素。baseballs.不过,类似的东西Carol eats baseballs.会匹配Carol eats


推荐阅读