我的名字有“西密歇根”,“伊利诺伊州北部”,我需要将它们改为“W Michigan”和“N Illinois”。以下是我最接近的但是失败原因让我说我匹配“西密歇根”这个词它会抛出一个错误并说\ 2是一个无法比拟的组(\ 3似乎返回我想要的W)。 (这是python)
re.sub("^((S)outhern|(E)astern|(W)estern|(N)orthern)", r"\2", long_name)
答案 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',依此类推。
要纠正此问题,请匹配单词并使用匹配单词的第一个字符。