Python正则表达式中字符集中的反斜杠(backslash)如何指定“非反斜杠”字符集?

5
我想使用python正则表达式来去除LaTeX文件中的注释。在LaTeX中,注释以“%”开头。但是如果百分号字符被转义(“\%”),那么它不是注释,而是“百分比”符号。
这个任务只是我在LaTeX文本上应用的许多regexp之一。我将所有这些正则表达式存储在一个字典列表中。
我面临的问题是,我用于修剪注释的正则表达式不起作用(因为我不知道如何指定“非反斜杠”字符集)。字符集中的反斜杠会转义闭合的“]”,从而导致正则表达式无效。
我的代码:
regexps=[]
regexps.append({r'left':'%.*', 'right':r''}) # this strips all the comments, but messes up with the percent characters (\%)
regexps.append({r'left':'[^\]%.*', 'right':r''}) # this is incorrect (escapes the closing "]" )
return applyRegexps(latexText, regexps)


def applyRegexps(text, listRegExp):
    """ Applies successively many regexps to a text"""
    if testMode:
        print str(listRegExp)
    # apply all the regexps in the list
    for element in listRegExp:
        left = element['left']
        right = element['right']
        r=re.compile(left)
        text=r.sub(right,text)
    return text

任何帮助都将不胜感激。谢谢! Gilles

你尝试使用 r'[^\\]' 了吗?\\ 应该是正则表达式中转义反斜杠的语法。 - Bakuriu
如果您想在正则表达式中插入一个反斜杠,请将其加倍。您的模式应该读作 '[^\]%.*'。 - Konstantin Tarashchanskiy
谢谢大家,Martijn Pieters的回答有效。我可能有点累了... - user1821466
2个回答

5

只需将反斜杠加倍,但使用原始字符串文字可避免再次加倍:

regexps.append({'left':r'[^\\]%.*', 'right':r''})

1

虽然Martijn Pieters的回答是你要求的,但我不确定这是否是你真正想要的。例如,此模式将不会匹配字符串的第一个字符%(因为它前面没有非反斜杠字符)。实际上,你可能需要的是负向先行断言(仍需转义反斜杠):

r'(?<!\\)%.*'

它们的区别在于:

  • [^\\]% 匹配一个由非反斜杠字符(包括该字符在内)前导的 %
  • (?<!\\)% 匹配一个没有被反斜杠字符前导(不包括它在匹配中)的 %

后者也适用于字符串开头的 %


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接