正则表达式字符串匹配失败

时间:2017-07-28 08:05:45

标签: regex

我不明白正则表达式字符串匹配是如何工作的

r2 = r'a[bcd]*b'
m1 = re.findall(r2,"abcbd")
abcb

这符合regex

中的解释

步骤3引擎尝试匹配b,但当前位置位于字符串的末尾,因此失败。

怎么样?我不明白这个?

2 个答案:

答案 0 :(得分:4)

以下正则表达式a[bcd]*b匹配最长的子字符串(因为*是贪婪的):

  • aa
  • 开头
  • [bcd]*后面跟着集合中的任何数字(0:可以匹配空字符串)(b,c,d)
  • bb
  • 结尾

编辑:以下评论,回溯发生在以下示例中

>>> 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?一样,那么整个字符串就会匹配。