5

Python regexp を使用して、LaTeX ファイルのコメントを削除したいと考えています。LaTeX では、コメントは "%" で始まります。ただし、% 文字がエスケープされている場合 ("\%")、コメントではなく、パーセント記号です。

このタスクは、LaTeX テキストに適用する多くの正規表現の 1 つにすぎません。これらすべての正規表現を辞書のリストに保存します。

私が直面している問題は、コメントのプルーニングに使用する正規表現が機能しないことです (「バックスラッシュではない」文字セットを指定する方法がわからないため)。文字セットのバックスラッシュは終了の ']' をエスケープしており、正規表現は正しくありません。

私のコード:

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

バックスラッシュを 2 倍にするだけですが、生の文字列リテラルを使用して再度2 倍にする必要がないようにしてください。

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

Martijn Pieters の回答はあなたが求めたものですが、これがあなたが本当に求めているものかどうかはわかりません。たとえば、このパターンは%文字列の最初の文字として a と一致しません (その前にバックスラッシュ以外の文字がないため)。実際に必要なのは、おそらく否定的な先読みです (バックスラッシュをエスケープする必要があります)。

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

違いは次のとおりです。

  • [^\\]%バックスラッシュ以外の文字が前にある a に一致し%ます (一致にその文字を含む)
  • (?<!\\)%バックスラッシュ文字が前にないa に一致し%ます (一致に含めずに)

%後者は文字列の先頭にも当てはまります。

于 2012-11-13T17:16:46.383 に答える