我在做一个关于正则表达式课程的练习题:
如果第一个单词是Alice、Bob或Carol;第二个单词是eats、pets或throws;第三个单词是apples、cats或baseballs;句子以句号结尾,那么如何编写与之匹配的正则表达式呢?这个正则表达式应该不区分大小写。它必须符合以下条件:
我的代码如下:
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()
不将整个句子作为匹配返回。i、 我期望'Carol throws baseballs.'
作为mo.group()
您需要告诉regex以某种方式对选项列表进行分组,否则它自然会认为这是一个巨大的列表,其中一些元素包含空格。最简单的方法是对每个单词使用捕获组:
尾随期不应该是选项的一部分。如果出于某种原因不想使用捕获组(这实际上不会影响匹配的方式),可以改用非捕获组。用
(?:...)
替换(...)
。你知道吗原始regex被解释为以下一组选项:
Alice
Bob
Carol\seats
pets
throws\sapples.
cats.
baseballs.
空间不会神奇地分隔选项。希望您能理解为什么除了
baseballs.
之外Carol throws baseballs.
的元素都不在该列表中。像Carol eats baseballs.
这样的东西会匹配Carol eats
。你知道吗你应该把所有的单词分组
您的re应该如下所示:
请注意,我使用(?)?:)而不是(),因为分组仅用于逻辑目的
相关问题 更多 >
编程相关推荐