为什么 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.'
,这是最后一场比赛。
我很困惑为什么:
对于我通过的前两个 str 示例,它 returned 第一个匹配项('Bob'
或 'Alice'
),而我通过的第三个 str 示例return编辑了最后一场比赛 ('baseball'
)?
在所有 3 个 str 示例中,我不确定为什么 mo.group()
没有 return 将整个句子作为匹配项。即我期待 'Carol throws baseballs.'
作为 mo.group()
的输出
你应该把所有的词分组
你的回复应该是这样的:
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+)
我正在做正则表达式课程的练习题:
你会如何编写一个正则表达式来匹配第一个单词是 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.'
,这是最后一场比赛。
我很困惑为什么:
对于我通过的前两个 str 示例,它 returned 第一个匹配项(
'Bob'
或'Alice'
),而我通过的第三个 str 示例return编辑了最后一场比赛 ('baseball'
)?在所有 3 个 str 示例中,我不确定为什么
mo.group()
没有 return 将整个句子作为匹配项。即我期待'Carol throws baseballs.'
作为mo.group()
的输出
你应该把所有的词分组
你的回复应该是这样的:
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+)