为什么 python 正则表达式搜索方法不能始终如一地 return 正确匹配对象?

Why doesn't python regex search method consistently return the matched object correctly?

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

你会如何编写一个正则表达式来匹配第一个单词是 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.''Alice throws Apples.' 时,mo.group() 仅分别为 returns 'Bob''Alice',但我期待它到 return 整个句子。

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

我很困惑为什么:

你应该把所有的词分组

你的回复应该是这样的:

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

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

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

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.

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

你也可以这样做:

(\w{3,5}) (\w*) ([^f]\w+)