Ok, I would like to use a regular expression that I create dynamically to search and replace words in a file. For instance:

import re
fl = re.compile('abc|def|ghi')
ts = 'xyz abc mno def'

n = fl.search(ts)

print n

How would I find all matches in the string? So far, "n" only returns the first occurence.

Or, maybe I'm going about this wrong anyway. What I would like to do is find each match that is in my re:compile, and replace it with additional text appended to that match. So, my text string would end up being 'xyz match=abc mno match=def', as 'abc' and 'def' are items in my re. In my real world example, my re:compile string is created dynamically and will have anywhere from 10 to 50 items (this part of the code works fine), but I'm having a hard time making a one to one relationship with the item in the re:compile with what is actually found. Since regular expressions are supposed to be fast, I didn't explore using a loop yet, but maybe that's the only way. Advice?

10 Years
Discussion Span
Last Post by sneekula

You are better off doing it this way and then process the resulting list ...

import re

fl = re.compile('(abc|def|ghi)')
ts = 'xyz abc mno def'

q = fl.findall(ts)

print q  # ['abc', 'def']

For a straight replace ...

import re

fl = re.compile('(abc|def|ghi)')
ts = 'xyz abc mno def'

ms = fl.sub('zzz', ts)

print ms  # xyz zzz mno zzz

Thanks very much. The fl.sub works like a charm.

But, how can I append the item that I am searching for with the replacement text? For instance, instead of "xyz zzz mno zzz" as a result, I would like "xyz abczzz mno defzzz".


In this case you are better off to use just Python. Actually, regular expressions aren't necessarily faster. I added plenty of comments to help you:

ts = 'xyz abc mno def'
# separate at space to create a list
space = ' '
qs = ts.split(space)

# search for these items
search_list = ['abc', 'def', 'ghi']

# append this string to search item
s = 'zzz'

# now create a new list with processed search items
new_list = []
for q in qs:
    if q in search_list:
        # concatinate strings
        q += s

# join the list to form the modified string
new_ts = space.join(new_list)

print new_ts  # xyz abczzz mno defzzz
This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.