我想将完全目标词与正则表达式匹配,使得所需单词可以在句子/字符串中的任何位置(甚至在结尾处)。此外,不区分大小写也是必需的。
以下是该程序应如何运作的示例。
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
。
有人可以解释为什么会这样吗?为了我的目的,正确的正则表达式是什么?
答案 0 :(得分:2)
这里的问题不在于交替本身,而是因为您使用\b
作为锚点是交替的一部分:
reg_expr2 = r'^(.*?(\bfoo|bar\b)[^$]*)$'
这应该是
reg_expr2 = r'^(.*?\b(foo|bar)\b[^$]*)$'