【问题标题】:Regex Replace w Match正则表达式替换 w 匹配
【发布时间】:2013-12-06 20:21:17
【问题描述】:

我有像“Western Michigan”“Northern Illinois”这样的名字,我需要将它们更改为“W Michigan”和“N Illinois”。以下是我最接近的,但这失败了,因为假设我匹配“西密歇根”这个词,它会抛出一个错误,并说 \2 是一个不匹配的组(\3 似乎返回了我想要的 W)。 (这是蟒蛇)

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

【问题讨论】:

  • 你真的需要一个正则表达式吗?

标签: python regex replace match


【解决方案1】:

您有 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)

【讨论】:

    【解决方案2】:

    正则表达式的分组是由第 nth 个左括号:

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

    因此,如果匹配,则第二组将是“S”,如果匹配,则第三组将是“E”,依此类推。

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

    【讨论】:

    • 我喜欢您对问题的解释,但我认为您的回答可以从“匹配单词并使用第一个字符”的具体示例中受益,因为这并不明显文本。
    • 绝对可以,但问题是,虽然我对正则表达式的一些细微差别相当熟悉,但我的 python 技能相当缺乏,而且我确信我无法正确地生成 pythonic为了它。如果另一个答案想要将我已经得到的两行合并到他们自己的行中,我很乐意将我自己的答案删除为多余的。
    【解决方案3】:

    您可以传递回调,而不是传递替换模式:

     re.sub("^(?P<word>Southern|Eastern|Western|Northern)", 
            lambda match: match.group('word')[0], 
            'Northern Illinois')
    

    【讨论】:

    • 感谢这完美的作品。你能解释一下语法吗?我不明白 1) "?P" 2) 这个 lambda 是如何在这里工作的
    • (?P&lt;group_name&gt; [your pattern] ) 表示一个命名组,因此您可以通过名称 match.group('group_name') 来引用它,而不是通过数字 (match.group(1)) 来引用它。更多信息在这里:docs.python.org/3/library/re.html#module-re
    猜你喜欢
    • 2012-05-16
    • 2021-02-23
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 2011-10-11
    • 1970-01-01
    相关资源
    最近更新 更多