我正在尝试使用regex子分组匹配多个模式,并用星号替换匹配的数据文件,该数据文件的格式与下面的字符串类似。然而,我在第一场比赛中只得到了想要的结果。随后的匹配使用了我没有预料到的字符串。是否有更好的方法获得下面所需的输出?
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 *
替换不会重置组编号,因此您的组编号为(1)(2)|(3)(4)|(5)(6)
,但您只重新插入组1-但也应该为组3和5这样做。由于替换时不匹配的组被视为空字符串,您可以简单地将它们添加到您的模式中,如\g
另一方面,我建议在处理正则表达式模式时使用原始字符串(r'pattern'
),这样您就不必想知道在哪里使用双反斜杠(例如\\b
)。