python正则表达式的字符集中的反斜杠(如何指定'不是反斜杠'字符集)?

时间:2012-11-13 17:00:29

标签: python regex

我想使用python regexp删除LaTeX文件中的注释。在LaTeX中,评论以“%”开头。但是,如果%字符被转义(“\%”),那么它不是注释,而是符号百分比。

此任务只是我在LaTeX文本中应用的众多正则表达式中的一个。我将所有这些reg exp存储在一个dicts列表中。

我面临的问题是我用于修剪注释的正则表达式不起作用(因为我不知道如何指定字符集'不反斜杠')。

表示字符集中的反斜杠会转义结束']'并且正则表达式不正确。

我的代码:

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

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

吉勒

2 个答案:

答案 0 :(得分:5)

只需加倍反斜杠,但请使用原始字符串文字,以避免再次将它们加倍

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

答案 1 :(得分:1)

虽然Martijn Pieters的回答是你要求的,但我不确定这是你真正想要的。例如,此模式将不匹配%作为字符串的第一个字符(因为前面没有非反斜杠字符)。你真正想要的可能是一个负面的预测(你仍然需要逃避反斜杠):

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

区别在于:

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

后者对于字符串开头的%也是如此。