在python中与*和+相关的正则表达式

2024-04-27 00:50:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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”在这两个程序。但是没有

为什么会这样?你知道吗


Tags: import程序researchgroup事件printpat
3条回答

+至少与前面的一个字符或组匹配。[aeiou]+因此将匹配aeiou(元音)中的至少一个。你知道吗

正则表达式将查找字符串中的任何地方,以找到它要查找的最小1个元音,并按您的期望执行(它将不懈地尝试满足条件)。你知道吗

*但是表示至少0,这也意味着它不能匹配任何内容。也就是说,当regex引擎开始在要测试的字符串的开头查找匹配项时,它没有找到匹配项,因此0匹配条件得到满足,这就是您获得的结果。你知道吗

如果您使用了字符串ear,请注意,您将使用ea作为匹配项。你知道吗

使用[aeiou]*,模式在开头匹配。您可以使用^{}确认:

>>> import re
>>> sub="dear"
>>> pat="[aeiou]*"
>>> m=re.search(pat,sub)
>>> m.start()
0
>>> m.end()
0
>>> m.group()
''

This doesnt prints anything.

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

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

这将打印:

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

为什么会有这种行为?

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

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

所有的*'s表示匹配项的位置。你知道吗

  • d与模式不匹配。所以match是前面的空字符串。你知道吗
  • ea与模式匹配。所以下一个匹配是ea。你知道吗
  • r与模式不匹配。所以匹配是r之前的空字符串。你知道吗
  • 最后一个空字符串是r之后的空字符串。你知道吗

相关问题 更多 >