【问题标题】:Why doesn't python regex search method consistently return the matched object correctly?为什么 python 正则表达式搜索方法不能始终正确地返回匹配的对象?
【发布时间】:2018-09-29 15:23:22
【问题描述】:

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

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

  • 爱丽丝吃苹果。
  • 鲍勃宠物猫。
  • 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() 分别只返回'Bob''Alice',但我期待它返回整个句子。

当我通过str='Carol throws baseballs.' 时,mo.group() 返回'baseballs.',这是最后一个匹配项。

我不知道为什么:

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

  • 在所有 3 个 str 示例中,我不确定为什么 mo.group() 没有将整个句子作为匹配项返回。即我期待 'Carol throws baseballs.' 作为 mo.group() 的输出

【问题讨论】:

  • 因为你没有对管道进行分组
  • 感谢您的评论,为什么我们需要在 () 中对管道进行分组?我认为只有在我们正在寻找组时才使用括号分组;我正在寻找匹配整个表达式....也没有解释为什么“棒球”。在该示例中返回。
  • 因为您将句号作为选项的一部分。

标签: python regex python-3.x regex-group


【解决方案1】:

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

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. 的元素出现在该列表中。不过像Carol eats baseballs. 这样的东西会匹配Carol eats

【讨论】:

  • 谢谢!最初我认为不需要分组括号,因为我不想对任何东西进行分组......现在我知道它需要告诉 Python 来“分段”选项
  • 我已经更新了我的答案以完全回答您问题的两个部分
  • 非常感谢!使用 \s 表示空格,这让我大开眼界。我有很多东西要学!
【解决方案2】:

你应该把所有的词分组

你的 re 应该是这样的:

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

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

【讨论】:

    【解决方案3】:

    你也可以这样做:

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

    【讨论】:

    • 我怀疑这会有所帮助,甚至根本有效。为了说服我,请解释这是如何工作的以及为什么它应该有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    相关资源
    最近更新 更多