There are two things to note here:
re.findallreturns captured texts if the regex pattern contains capturing groups in it
r'\\.'part in your pattern matches two consecutive chars,
\and any char other than a newline.
If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. Empty matches are included in the result unless they touch the beginning of another match.
Note that to make
re.findall return just match values, you may usually
- remove redundant capturing groups (e.g.
- convert all capturing groups into non-capturing (that is, replace
(?:) unless there are backreferences that refer to the group values in the pattern (then see below)
[x.group() for x in re.finditer(pattern, s)])
In your case,
findall returned all captured texts that were empty because you have
r'' string literal that tried to match a literal
To match the numbers, you need to use
The regex matches:
-?– Optional minus sign
\d*– Optional digits
\.?– Optional decimal separator
\d+– 1 or more digits.
Here is IDEONE demo:
import re s = r'abc123d, hello 3.1415926, this is my book' pattern = r'-?\d*\.?\d+' L = re.findall(pattern, s) print(L)