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为integers
和floats
使用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)