我的代码如下:
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’
。为什么我在这种情况下无法看到任何结果?
答案 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
函数在找到第一个空字符串后停止搜索。这就是你输出一个空字符串的原因......