Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python regex string match and replace at the same time

In Python, is there a way to search, return matched string, and replace matched strings all at the same time? See example below:

a = "[fox] dog turtle [cat]"

Goal:

result1 = "fox" #(first match inside bracket)
result2 = "cat" #(second match inside bracket)
result3 = "dog turtle" #(remaining string after removing matched text inside brackets

What I have:

result1, result2 = re.findall('\[.*?\]', a)
result3 = re.sub('\[.*?\]', '', a)

It seems redundant and clunky to have to run re twice. Is there a more elegant way to achieve this?

like image 927
JJLL Avatar asked Oct 19 '25 14:10

JJLL


1 Answers

I think your code is Elegant enough and readable, but if you want to complicate things, There is not function that return matches and replace them in the same time but you can use the force of re.sub that accepts in repl argument a function that accept the matche as argument and should return a str replacement, it's used for dynamic replacing (example: when the replacing depends on the value of the match it self).

import re

a = '[fox] dog turtle [cat]'
matches = []
# append method of list return None so the return string is always `''`
# so when ever we find a match to replace we add it to matches list and replace it with `''`
# in your result you return the fox without brackets so i'm using a capture group inside the brackets
text = re.sub('\[(.*?)\]', lambda m: matches.append(m.group(1)) or '', a)

print(matches)  # ['fox', 'cat']
print(text)  # dog turtle
like image 95
Charif DZ Avatar answered Oct 21 '25 03:10

Charif DZ



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!