我正在尝试使用正则表达式子分组来匹配多个模式,并使用与以下字符串相似的格式的数据文件将匹配项替换为星号。但是,我只得到了第一场比赛的预期结果。后续的匹配消耗了我没想到的字符串。有没有更好的方法可以在下面获得所需的输出?
import re
myString = '-fruit apple -number 123 -animal cat -name bob'
match = re.compile('(-fruit\s+)(\w+)|'
'(-animal\s+)(cat)|'
'(-name\s+)(bob)')
print(match.sub('\g<1>*', myString))
当前输出:
-fruit * -number 123 * *
所需的输出:
-fruit * -number 123 -animal * -name *
答案 0 :(得分:2)
替代方法不会重设组号,因此您的组编号为(1)(2)|(3)(4)|(5)(6)
,但您只重新插入了组1-但也应该对组3和5进行重新插入。由于替换时不匹配的组被视为空字符串,因此您只需将它们添加到\g<1>\g<2>\g<3>*
之类的模式中即可。
在旁注中,我建议在使用正则表达式模式(r'pattern'
)时使用原始字符串,因此您不必怀疑在哪里加双反斜杠(例如\\b
)。