Python re.findallperformance怪异

源string是:

# Python 3.4.3 s = r'abc123d, hello 3.1415926, this is my book' 

这是我的模式:

 pattern = r'-?[0-9]+(\\.[0-9]*)?|-?\\.[0-9]+' 

然而, re.search可以给我正确的结果:

 m = re.search(pattern, s) print(m) # output: <_sre.SRE_Match object; span=(3, 6), match='123'> 

re.findall只是re.findall一个空的列表:

 L = re.findall(pattern, s) print(L) # output: ['', '', ''] 

为什么不能re.findall给我预期的名单:

 ['123', '3.1415926'] 
 s = r'abc123d, hello 3.1415926, this is my book' print re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s) 

当您使用raw mode时,不需要escape两次。

输出: ['123', '3.1415926']

另外,返回types将是一个strings列表。如果你想返回types为integersfloats使用map

 import re,ast s = r'abc123d, hello 3.1415926, this is my book' print map(ast.literal_eval,re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s)) 

输出: [123, 3.1415926]

在你的情况下, findall返回所有被捕获的文本是空的,因为你已经\\ r'' \\ r''string文字试图匹配文字\ 。 请参阅findall参考 :

如果模式中存在一个或多个组,则返回组的列表; 这将是一个元组列表,如果该模式有多个组。 空结果包含在结果中,除非他们触及另一场比赛的开始。

要匹配的数字,你需要使用

 -?\d*\.?\d+ 

正则expression式匹配:

  • -? – 可选的减号
  • \d* – 可选的数字
  • \.? – 可选小数点分隔符
  • \d+ – 1位或更多位数。

看演示

这里是IDEONE演示 :

 import re s = r'abc123d, hello 3.1415926, this is my book' pattern = r'-?\d*\.?\d+' L = re.findall(pattern, s) print(L)