【问题标题】:Python reference to regex in parenthesesPython 引用括号中的正则表达式
【发布时间】:2013-08-15 03:53:19
【问题描述】:

我有一个文本文件,如果它前面没有紧跟数字,则需要删除字母“t”。

我正在尝试使用 re.sub 执行此操作,但我有这个:

f=open('File.txt').read()
g=f
g=re.sub('([^0-9])t','',g)

这会识别要正确删除的字母,但也会删除前面的字符。如何在替换字符串中引用带括号的正则表达式? 谢谢!

【问题讨论】:

    标签: python regex


    【解决方案1】:

    改用lookbehind(或否定lookbehind)。

    g=re.sub('(?<=[^0-9])t','',g)
    

    g=re.sub('(?<![0-9])t','',g)
    

    【讨论】:

    • 这也避免了重叠匹配的问题,原来的正则表达式只会在'tt'中看到一个匹配。
    【解决方案2】:

    三个选项:

    g=re.sub('([^0-9])t','\\1',g)
    

    g=re.sub('(?<=[^0-9])t','',g)
    

    g=re.sub('(?<![0-9])t','',g)
    

    第一个选项是您要查找的内容,即对捕获的字符串的反向引用。 \\1 将引用第一个捕获的组。

    lookarounds 不消耗字符,因此您不需要将它们替换回来。在这里,我对第一个使用了正面的lookbehind,对第二个使用了负面的lookbehind。那些不使用括号内的字符,因此您不会在替换中使用[^0-9][0-9]。使用它们可能会更好,因为它可以防止重叠匹配。

    正向后视确保t 前面有一个非数字字符。否定的lookbehind确保t前面没有数字字符。

    【讨论】:

    • 我试过 \1 但我相信它是python中其他东西的保留字符。不过,其他选项也可以,谢谢。
    • @macklin 嗯,也许可以试试g=re.sub('([^0-9])t', r'\1',g) 第一个。我还没那么习惯 python ^^;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 2011-07-18
    • 2013-06-14
    • 1970-01-01
    相关资源
    最近更新 更多