Reputation: 7461
I have strings that contain a number somewhere in them and I'm trying to replace this number with their word notation (ie. 3 -> three). I have a function that does this. The problem now is finding the number inside the string, while keeping the rest of the string intact. For this, I opted to use the re.sub
function, which can accept a "callable". However, the object passed to it is the internal _sre.SRE_Match
and I'm not sure how to handle it. My function accepts a number or its string representation.
How should I write some helper function which can be used to bridge the re.sub
call with my function doing the required processing? Alternatively, is there a better way to do what I want?
Upvotes: 67
Views: 47216
Reputation: 29579
A solution without lambda
import re
def convert_func(matchobj):
m = matchobj.group(0)
map = {'7': 'seven',
'8': 'eight',
'9': 'nine'}
return map[m]
line = "7 ate 9"
new_line = re.sub("[7-9]", convert_func, line)
Upvotes: 10
Reputation: 91119
To make your function fit with re.sub
, you can wrap it with a lambda:
re.sub('pattern', lambda m: myfunction(m.group()), 'text')
Upvotes: 33
Reputation: 474031
You should call group()
to get the matching string:
import re
number_mapping = {'1': 'one',
'2': 'two',
'3': 'three'}
s = "1 testing 2 3"
print re.sub(r'\d', lambda x: number_mapping[x.group()], s)
prints:
one testing two three
Upvotes: 87