2

我是 python 新手。我不明白这些程序在 python 中的行为。

import re
sub="dear"
pat="[aeiou]+"
m=re.search(pat,sub)
print(m.group())

这打印“ea”

import re
sub="dear"
pat="[aeiou]*"
m=re.search(pat,sub)
print(m.group())

这不会打印任何东西。

我知道 + 匹配 1 次或多次出现, * 匹配 0 次或多次出现。我希望它在两个程序中都打印“ea”。但事实并非如此。

为什么会发生这种情况?

4

3 回答 3

9

这不会打印任何东西。

不完全是。它打印一个空字符串,您当然没有注意到,因为它不可见。尝试改用此代码:

l = re.findall(pat, sub)
print l

这将打印:

['', 'ea', '', '']

为什么会有这种行为?

这是因为当您使用*量词 -时[aeiou]*,此正则表达式模式还会匹配每个不匹配字符串之前的空字符串以及末尾的空字符串。因此,对于您的 string dear,它匹配如下:

*d*ea*r*  // * where the pattern matches.

所有这些都*'s表示您的比赛的位置。

  • d与模式不匹配。所以 match 是它之前的空字符串。
  • ea匹配模式。所以下一场比赛是ea.
  • r与模式不匹配。所以匹配之前是空字符串r
  • 最后一个空字符串是后面的空字符串r
于 2013-09-24T16:45:44.313 回答
3

使用[aeiou]*, 开头的模式匹配。您可以确认使用MatchObject.start

>>> import re
>>> sub="dear"
>>> pat="[aeiou]*"
>>> m=re.search(pat,sub)
>>> m.start()
0
>>> m.end()
0
>>> m.group()
''
于 2013-09-24T16:45:01.447 回答
1

+至少匹配它之前的字符或组之一。因此将匹配, , ,或(元音)[aeiou]+中的至少一个。aeiou

正则表达式将在字符串中的任何地方查找它正在寻找的最小 1 个元音并执行您期望的操作(它将无情地尝试满足条件)。

*然而意味着至少为 0,这也意味着它不能匹配任何内容。也就是说,当正则表达式引擎开始在要测试的字符串的开头寻找匹配项时,它没有找到匹配项,因此0满足匹配条件,这就是您获得的结果。

如果您使用了 string ear,请注意您将拥有ea匹配项。

于 2013-09-24T16:46:27.353 回答