Double numbers


We have a string that has some numbers in it. We would like to double the numbers.

In the first example we can see a relatively simple way of doubling the numbers. We captuter a number using the (\d+) expression that will save the current number in \1 and then we include it twice: \1\1. This will convert a number like 1 to 11. This is nice, but probably not what we wanted. We wanted to convert 1 to 2 and 34 to 68.

We can't do that with plain regular expressions and substitutions as that is all string-based. The plain substitution can only move around characters, but it cannot do any complex operations on the and thus cannot compute anything.

However, if the substitution part is a function then Python will call that function passing in the match object and whatever the function returns will be the replacement string. This function can be a regular function defined with def or a lambda expression.

In the second example we see the solution with lambda-expression.

The 3rd examples is the same solution but in a very step-by-step way with lots of temporary variables. This will hopefully help understand the lambda-expression in the 2nd example.


examples/regex/duplicate_numbers.py
import re

text = "This is 1 string with 3 numbers: 34"

new_text = re.sub(r'(\d+)', r'\1\1', text)
print(new_text)   # This is 11 string with 33 numbers: 3434

double_numbers = re.sub(r'(\d+)', lambda match: str(2 * int(match.group(0))), text)
print(double_numbers)  # This is 2 string with 6 numbers: 68


# The same but in a function

def double(match):
    matched_number_as_str = match.group(0)
    number = int(matched_number_as_str)
    doubled_number = 2 * number
    doubled_number_as_str = str(doubled_number)
    return doubled_number_as_str

double_numbers = re.sub(r'(\d+)', double, text)
print(double_numbers)  # This is 2 string with 6 numbers: 68