5

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

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

我面临的问题是我用于修剪评论的正则表达式不起作用(因为我不知道如何指定字符集'非反斜杠')。字符集中的反斜杠转义了结束的 ']' 并且正则表达式不正确。

我的代码:

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

任何帮助都感激不尽。谢谢!

吉尔斯

4

2 回答 2

5

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

regexps.append({'left':r'[^\\]%.*', 'right':r''})
于 2012-11-13T17:03:18.853 回答
1

尽管 Martijn Pieters 的答案是您所要求的,但我不确定这是否是您真正想要的。例如,此模式不会将 a%作为字符串的第一个字符匹配(因为它前面没有非反斜杠字符)。你真正想要的可能是一个负前瞻(你仍然需要转义反斜杠):

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

区别在于:

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

后一个也适用%于字符串的开头。

于 2012-11-13T17:16:46.383 回答