2012-11-13 8 views
5

Python regexpを使ってLaTeXファイルのコメントを削除したいと思います。 LaTeXでは、コメントは "%"で始まります。しかし、%文字がエスケープされていれば( "\%")、コメントではなく、シンボル%です。Python regexpの文字セット内のバックスラッシュ( 'バックスラッシュではない'文字セットの指定方法)?

このタスクは、私がLaTeXテキストに適用する多くの正規表現の中の1つに過ぎません。私はすべてのこれらの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 

すべてのヘルプははるかに高く評価されます。ありがとう!

ジル

+0

'r '[^ \\]''を使ってみましたか? '\\'はバックスラッシュをエスケープするための正規表現構文でなければならない – Bakuriu

+0

リテラルのバックスラッシュを正規表現に入れたい場合は、それを二重にします。あなたの後ろに '[^ \\]%。*'と書かれています。 –

+0

ありがとう、Martijn Pietersは作品に答えます。私は疲れていなければなりません... – user1821466

答えて

5

単純に二重のバックスラッシュが、再びをそれらを倍増することを避けるためにリテラル生の文字列を使用して行います。

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

'左'の生の文字列は不必要です... – l4mpi

+0

@ l4mpi:確かにOPはキーの生の文字列も持っています。 –

1

マルタインピータースの答えは、あなたが尋ねたものですが、Iこれがあなたが本当に探しているものであるかどうかは分かりません。たとえば、このパターンは文字列の最初の文字として%と一致しません(その前にバックスラッシュ文字がないため)。 (含む

  • [^\\]%が非バックスラッシュ文字が先行%に一致します。

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

    違いはこれです:あなたが実際に欲しいのは、おそらく否定先読み(それでもバックスラッシュをエスケープする必要があります)です試合でその文字)

  • (?<!\\)%一致でそれを含めずに(バックスラッシュ文字によって先行されていない%と一致)

後者は、文字列の先頭の%でも同様です。

関連する問題