【问题标题】:Match only final character of regex仅匹配正则表达式的最后一个字符
【发布时间】:2017-04-29 15:05:26
【问题描述】:

我有一些涉及大量 re.sub() 命令的 Python 代码。在某些情况下,我想替换一个字符,但前提是它出现在某些其他字符之后。以下是我目前如何在 python 中执行此操作的示例:

secStress = "[aeiou],"[-1]

所以我的输入将是一个字符串,例如“a,s I walk, I hum”。我想替换第一个逗号,而不是前面的“a”。

问题是 Python 不喜欢我给它一个变量作为 re.sub() 的输入。有没有办法我可以编写一个正则表达式来指定只有它的最后一个字符应该匹配?

【问题讨论】:

    标签: python regex


    【解决方案1】:

    您正在寻找捕获组/反向引用或积极的后向解决方案:

    s = "a,s I walk, I hum."
    
    # Capturing group / backreference
    print(re.sub(r"([aeiou]),", r"\1", s))
    
    # Positive lookbehind
    print(re.sub(r"(?<=[aeiou]),", "", s))
    

    请参阅Python demo

    第一进场详情

    ([aeiou]) 是一个捕获组,它匹配一个元音并将其存储在一个特殊的内存缓冲区中,您可以使用反向引用从替换模式中引用该缓冲区。在这里,组 ID 为 1,因此您可以使用 r"\1" 访问该值。

    二次进场详情

    (?&lt;=[aeiou]) 是一个正向向后查找,它只检查(但不将文本添加到匹配值)当前位置之前是否有元音。因此,只有那些以元音开头的逗号才匹配,并且用空字符串替换就足以摆脱逗号,因为它是匹配中唯一保留的符号。

    【讨论】:

      【解决方案2】:

      如果我理解正确的话,

      >>> import re
      >>> def doit(matchobj):
      ...     return matchobj.group()[0]
      ... 
      >>> re.sub(r'[aeiou],', doit, "a,s I walk, I hum.")
      'as I walk, I hum.'
      

      如果正则表达式匹配,则使用匹配的对象调用 doit。无论doit 返回的字符串(并且必须是字符串)都将替换匹配项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-12
        • 2023-02-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多