re.findall behaves weird

ghz 1years ago ⋅ 5566 views

Question

The source string is:

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

and here is my pattern:

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

however, re.search can give me correct result:

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

re.findall just dump out an empty list:

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

why can't re.findall give me the expected list:

['123', '3.1415926']

Answer

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

You dont need to escape twice when you are using raw mode.

Output:['123', '3.1415926']

Also the return type will be a list of strings. If you want return type as integers and floats use 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))

Output: [123, 3.1415926]