你可以使用re.sub with a callback,它返回matchobj.lastgroup:
import re
s = "the blue dog and blue cat wore 7 blue hats 9 days ago"
p = re.compile(r'blue (?P<animal>dog|cat)|(?P<numberBelowSeven>[0-7])|(?P<numberNotSeven>[8-9])')
def callback(matchobj):
return matchobj.lastgroup
result = p.sub(callback, s)
print(result)
产量
the animal and animal wore numberBelowSeven blue hats numberNotSeven days ago
请注意,如果您使用的是 Pandas,则可以使用 Series.str.replace:
import pandas as pd
def callback(matchobj):
return matchobj.lastgroup
df = pd.DataFrame({'foo':["the blue dog", "and blue cat wore 7 blue", "hats 9",
"days ago"]})
pat = r'blue (?P<animal>dog|cat)|(?P<numberBelowSeven>[0-7])|(?P<numberNotSeven>[8-9])'
df['result'] = df['foo'].str.replace(pat, callback)
print(df)
产量
foo result
0 the blue dog the animal
1 and blue cat wore 7 blue and animal wore numberBelowSeven blue
2 hats 9 hats numberNotSeven
3 days ago days ago
如果您有嵌套的命名组,您可能需要一个更复杂的回调,它遍历 matchobj.groupdict().items() 以收集所有相关的组名:
import pandas as pd
def callback(matchobj):
names = [groupname for groupname, matchstr in matchobj.groupdict().items()
if matchstr is not None]
names = sorted(names, key=lambda name: matchobj.span(name))
result = ' '.join(names)
return result
df = pd.DataFrame({'foo':["the blue dog", "and blue cat wore 7 blue", "hats 9",
"days ago"]})
pat=r'blue (?P<animal>dog|cat)|(?P<numberItem>(?P<numberBelowSeven>[0-7])|(?P<numberNotSeven>[8-9]))'
# pat=r'(?P<someItem>blue (?P<animal>dog|cat)|(?P<numberBelowSeven>[0-7])|(?P<numberNotSeven>[8-9]))'
df['result'] = df['foo'].str.replace(pat, callback)
print(df)
产量
foo result
0 the blue dog the animal
1 and blue cat wore 7 blue and animal wore numberItem numberBelowSeven blue
2 hats 9 hats numberItem numberNotSeven
3 days ago days ago