正则表达式结果

时间:2014-10-14 23:23:24

标签: python regex

我的代码如下:

import re

line = "78349999234";

searchObj = re.search(r'9*', line)

if searchObj:
   print "searchObj.group() : ", searchObj.group()
else:
   print "Nothing found!!"

但输出为空。我认为*意味着:使得到的RE匹配前面RE的0或更多次重复,尽可能多的重复。 ab*将匹配‘a’‘ab’‘a’,后跟任意数量的‘b’。为什么我在这种情况下无法看到任何结果?

2 个答案:

答案 0 :(得分:5)

我认为正则表达式匹配从左到右。所以匹配的第一个模式是7...之前的空字符串。如果找到9,它确实会与贪婪匹配:并尝试“ eat ”(这是正确的术语)尽可能多的字符。

如果您查询:

>>> print(re.findall(r'9*',line));
['', '', '', '', '9999', '', '', '', '']

它匹配字符之间的所有空字符串,如您所见,9999也匹配。

主要原因可能是性能:如果您搜索10M +字符串中的模式,如果模式已经在前10k个字符中,您会非常高兴。你不想浪费精力找到“最好的”匹配......


修改

0或更多次出现表示该组(在这种情况下为9)重复零次或多次。在空字符串中,字符重复正好0次。如果你想匹配字符重复一次或多次的模式,你应该使用

9+

这导致:

>>> print(re.search(r'9+', line));
<_sre.SRE_Match object; span=(4, 8), match='9999'>
对于接受空字符串的模式,

re.search可能没那么大帮助,因为它总是匹配字符串的实际开始之前的空字符串

答案 1 :(得分:1)

主要原因是,re.search函数在找到匹配项后停止搜索字符串。 9*表示匹配数字9 或更多次。因为在每个字符之前存在空字符串,re.search函数在找到第一个空字符串后停止搜索。这就是你输出一个空字符串的原因......