python - 为什么 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.'
,这是最后一场比赛。
我很困惑为什么:
对于我传递的前两个 str 示例,它返回了第一个匹配项(
'Bob'
或'Alice'
),而我传递的第三个 str 示例返回了最后一个匹配项('baseball'
)?在所有 3 个 str 示例中,我不确定为什么
mo.group()
不返回整个句子作为匹配项。即我期待'Carol throws baseballs.'
作为输出mo.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
。
推荐阅读
- c++ - Wxwidgets || 添加类和方法
- amazon-web-services - 将当前 Redshift 模式导入 Redshift QA 环境
- javascript - 儿童道具事件不保持父母的当前状态
- python - 在选定索引处插入字符串的程序
- sql - 同时计算两列中的值?SQL/SQLITE
- javascript - 带有 mapbox 的传单 - 设置默认语言
- azure - Azure DevOps Pipeline 中的 Terraform 获取订阅超时
- macos - Quasar Electron 构建无法在具有 arm64 架构的 M1 mac mini 上运行
- powershell - 开始睡眠意外行为
- excel - 在Excel VBA上用引号打印单元格值的写入函数