Guru
Guru

Reputation: 16984

How to evaluate replacement part in re.sub?

I have a string say 'Alex 28'. Now, I want to extract the number 28 and add it by 2 using regex.

In Perl, I could have got it like this:

#!/usr/bin/perl
use strict;
use warnings;

my $str='Alex 28';
$str=~s/(\d+)/$1+2/e;

To achieve this in Python, I tried the below:

#!/usr/bin/python

import re

str = 'Alex 28'

match=re.sub(r'(\d+)',r'\g<1>',str)

How do I add 2 to the '\g<1>' which has been fetched? I tried using int function, it is not working. Please help.

Version: Python 2.7.3

Upvotes: 1

Views: 1795

Answers (1)

icecrime
icecrime

Reputation: 76755

You can use re.sub by supplying a function to the repl argument:

If repl is a function, it is called for every non-overlapping occurrence of pattern. The function takes a single match object argument, and returns the replacement string.

For example:

def add_two(match):
    return str(int(match.group()) + 2)

s = 'Alex 28'
re.sub(r'(\d+)', add_two, s)

Or, using a lambda:

re.sub(r'(\d+)', lambda m: str(int(m.group()) + 2), s)

Please note that:

  • Using str as a variable name is a bad choice as it overrides the builtin str
  • Substitution works with strings exclusively, so the function passed as repl argument should return a string
  • I used match.group() which returns the whole match: you may need the specify the group index if the regex defines multiple groups.

Upvotes: 5

Related Questions