【问题标题】:Python replace only part of a re.sub matchPython 仅替换 re.sub 匹配的一部分
【发布时间】:2012-08-15 18:42:07
【问题描述】:

以下 Python 脚本:re.sub("[^a-zA-Z]pi[^a-zA-Z]", "(math.pi)", "2pi3 + supirse")

结果:'(math.pi) + supirse'

虽然pi 之前和之后的非字母匹配很关键,但我不希望在匹配中替换这些非字母字符。我想看到以下输出:'2(math.pi)3 + supirse'

注意:之前的建议如下:re.sub("\Bpi\B", "(math.pi)", "2pi3 + supirse")

导致完全替换每个实例:'2(math.pi)3 + su(math.pi)rse' 这也不是我想要的

【问题讨论】:

    标签: python regex match


    【解决方案1】:

    改用这个:re.sub("(?<=[^a-zA-Z])pi(?=[^a-zA-Z])", "(math.pi)", "2pi3 + supirse")

    可视化:http://regex101.com/r/fX5wX3

    【讨论】:

    • 这个指向 regex101 的链接非常有用!谢谢!
    【解决方案2】:

    使用前瞻/后瞻:

    import re
    
    print re.sub("(?<=[^a-zA-Z])pi(?=[^a-zA-Z])", "(math.pi)", "2pi3 + supirse")
    

    具体生成结果见这里:http://ideone.com/rSd8H

    【讨论】:

      【解决方案3】:

      事实上,您需要一个小写的"\b" 表示单词边界,而"\B" 表示不是单词边界

      试试这个:

      import re
      re.sub(r"\bpi\b", "(math.pi)", "2pi3 + supirse")
      

      这将产生'2pi3 + supirse'

      【讨论】:

        猜你喜欢
        • 2011-02-15
        • 2014-06-26
        • 2015-12-18
        • 2022-12-04
        相关资源
        最近更新 更多