Passing a function to re.sub in Python

PythonRegex

Python Problem Overview


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?

Python Solutions


Solution 1 - Python

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

Solution 2 - Python

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

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

Solution 3 - Python

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)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionVPericView Question on Stackoverflow
Solution 1 - PythonalecxeView Answer on Stackoverflow
Solution 2 - PythonglglglView Answer on Stackoverflow
Solution 3 - Pythonuser984003View Answer on Stackoverflow