正则表达式交替运算符|没有按预期工作 - Python

时间:2018-04-08 21:41:07

标签: python regex match

我想将完全目标词与正则表达式匹配,使得所需单词可以在句子/字符串中的任何位置(甚至在结尾处)。此外,不区分大小写也是必需的。

以下是该程序应如何运作的示例。

reg_expr = r'^(.*?(\bfoo\b)[^$]*)$'  

#Case 1
re.match(reg_expr,'foo abc',re.IGNORECASE) 
<_sre.SRE_Match object; span=(0, 7), match='foo abc'> # MATCH

#Case 2
re.match(reg_expr,'foos abc',re.IGNORECASE) 

# NO MATCH, WE WANT EXACTLY A foo MATCH

#Case 3
re.match(reg_expr,'abc foo',re.IGNORECASE) 
<_sre.SRE_Match object; span=(0, 7), match='abc foo'> # MATCH

此外,我必须匹配大量的句子,并尝试在单个正则表达式中匹配许多目标关键字。作为示例,我在正则表达式中添加了单词bar和替换操作数|

reg_expr2 = r'^(.*?(\bfoo|bar\b)[^$]*)$' 

#Case 1
re.match(reg_expr2,'foo abc',re.IGNORECASE)
<_sre.SRE_Match object; span=(0, 7), match='foo abc'> # MATCH

#Case 2
re.match(reg_expr2,'foos abc',re.IGNORECASE)
<_sre.SRE_Match object; span=(0, 8), match='foos abc'> # MATCH

#Case 3
re.match(reg_expr2,'abc foo',re.IGNORECASE)+
<_sre.SRE_Match object; span=(0, 7), match='abc foo'> # MATCH

只需添加交替运算符|,我们就可以看到案例2无法正常工作,因为字符串包含foos而不是foo。 有人可以解释为什么会这样吗?为了我的目的,正确的正则表达式是什么?

1 个答案:

答案 0 :(得分:2)

这里的问题不在于交替本身,而是因为您使用\b作为锚点是交替的一部分:

reg_expr2 = r'^(.*?(\bfoo|bar\b)[^$]*)$'

这应该是

reg_expr2 = r'^(.*?\b(foo|bar)\b[^$]*)$'