Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replace regex matches in a string with items from a list in order

Tags:

python

regex

For example, I've got a string like:

'blah blah 1.344 blah 1.455'

and a list like:

[2.888, 4.033]

I know that the string and the list contain an equal quantity of numbers and want to replace all the numbers in the string with the numbers from the list using regex. I want something like:

 re.sub('\d\.\d+', list[i], line)

but don't know how to make it replace each match with the next item from list, not just the same item. I want to preserve all of the text and all of the whitespace exactly the same, so splitting to a list, replacing by index and joining back seems not to be the thing I need.

like image 250
yxfxmx Avatar asked Dec 20 '22 02:12

yxfxmx


1 Answers

The second repl parameter to re.sub can be an arbitrary function that takes a single match object and returns a string to replace it. In your case:

>>> import re
>>> repl = [2.888, 4.033]
>>> re.sub(
    r'\d\.\d+',  # note raw string to avoid issues with backslashes
    lambda match: str(repl.pop(0)),  # replace each match with the next item in the list
    'blah blah    1.344 blah   1.455'
)
'blah blah    2.888 blah   4.033'
like image 181
jonrsharpe Avatar answered Apr 12 '23 14:04

jonrsharpe