我不明白正则表达式字符串匹配是如何工作的
r2 = r'a[bcd]*b'
m1 = re.findall(r2,"abcbd")
abcb
这符合regex
中的解释步骤3引擎尝试匹配b,但当前位置位于字符串的末尾,因此失败。
怎么样?我不明白这个?
答案 0 :(得分:4)
以下正则表达式a[bcd]*b
匹配最长的子字符串(因为*
是贪婪的):
a
以a
[bcd]*
后面跟着集合中的任何数字(0:可以匹配空字符串)(b,c,d)b
以b
编辑:以下评论,回溯发生在以下示例中
>>> re.findall(r2,"abcxb")
['ab']
abc
匹配a[bcd]*
,但不期望x
a
也匹配a[bcd]*
(因为空字符串匹配[bcd] *)ab
关于贪婪,单个字符,字符集或组之后的元字符*
表示任意次数(最可能的匹配),一些正则表达式引擎接受元字符序列*?
,将行为修改为尽可能少,例如:
>>> r2 = r'a[bcd]*?b'
>>> re.findall(r2,"abcbde")
['ab']
答案 1 :(得分:2)
您的正则表达式要求匹配以b
结尾,因此所有内容都与尾随d
匹配。如果b
是可选的,就像a[bcd]*b?
一样,那么整个字符串就会匹配。