Passing a function to re.sub in Python

Question:

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?

Asked By: VPeric

||

Answers:

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
Answered By: alecxe

To make your function fit with re.sub, you can wrap it with a lambda:

re.sub('pattern', lambda m: myfunction(m.group()), 'text')
Answered By: glglgl

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)
Answered By: user984003
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.