具有多种模式的Python Regex子

时间:2018-07-31 05:32:31

标签: python 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 个答案:

答案 0 :(得分:2)

替代方法不会重设组号,因此您的组编号为(1)(2)|(3)(4)|(5)(6),但您只重新插入了组1-但也应该对组3和5进行重新插入。由于替换时不匹配的组被视为空字符串,因此您只需将它们添加到\g<1>\g<2>\g<3>*之类的模式中即可。

在旁注中,我建议在使用正则表达式模式(r'pattern')时使用原始字符串,因此您不必怀疑在哪里加双反斜杠(例如\\b)。