正则表达式替换为匹配

时间:2013-11-22 03:44:33

标签: python regex replace match

我的名字有“西密歇根”,“伊利诺伊州北部”,我需要将它们改为“W Michigan”和“N Illinois”。以下是我最接近的但是失败原因让我说我匹配“西密歇根”这个词它会抛出一个错误并说\ 2是一个无法比拟的组(\ 3似乎返回我想要的W)。 (这是python)

re.sub("^((S)outhern|(E)astern|(W)estern|(N)orthern)", r"\2", long_name)

3 个答案:

答案 0 :(得分:4)

你有5个捕获组 - 但已经解释过了。如果将它减少到1个捕获组,你可以轻松得到你想要的东西,但它有点微妙。首先,您使用“积极前瞻断言”来确保您正在查看感兴趣的“长词”之一。但是,断言不会匹配任何东西。它只是限制了搜索。然后你可以捕获下面的字母,然后消耗其余的字母。像这样:

pat = r"""(?=Southern|Eastern|Western|Northern)  # looking at one of these words
          (.)   # just capture the first character
          (outhern|astern|estern|orthern)  # and consume the rest"""
pat = re.compile(pat, re.VERBOSE)
pat.sub(r"\1", long_name)

答案 1 :(得分:3)

您可以传递回调:

,而不是传递替换模式
 re.sub("^(?P<word>Southern|Eastern|Western|Northern)", 
        lambda match: match.group('word')[0], 
        'Northern Illinois')

答案 2 :(得分:2)

正则表达式的分组是由n th 打开的paren:

#        12          3         4         5
re.sub("^((S)outhern|(E)astern|(W)estern|(N)orthern)", r"\2", long_name)

因此,第二组如果匹配则为'S',第三组如果匹配则为'E',依此类推。

要纠正此问题,请匹配单词并使用匹配单词的第一个字符。