2017-08-08 7 views
0

私は、テキストファイルのCの関数定義を一致させるために使用される正規表現(this questionを参照)を持っています。特に、私はいくつかのgit diff出力に取り組んでいます。Pythonで複雑な正規表現の先頭にある文字をどのように一致させるか?

f = open(input_file) 
diff_txt = ''.join(f.readlines()) 
f.close 

re_flags = re.VERBOSE | re.MULTILINE 
pattern = re.compile(r""" 
         (^[^-+]) # Problematic line: Want to ensure we do not match lines with +/- 
         (?<=[\s:~]) 
         (\w+) 
         \s* 
         \(([\w\s,<>\[\].=&':/*]*?)\) 
         \s* 
         (const)? 
         \s* 
         (?={) 
         """, 
         re_flags) 

input file通常の方法で生成されたいくつかの生git diff出力されます:

git diff <commit-sha-1> <commit-sha-2> > tmp.diff 

私の正規表現文字列の最初の行(^[^-+])には問題があります。この行がなければ、正規表現はinput_fileのすべてのC/C++関数に首尾よくマッチしますが、それと一致するものはありません。私は、ドキュメントを読んで、私は」することができます私は、2つのリポジトリリビジョンの間に追加または削除された機能を除外するためにwan'tので、この行を必要とし、追加および削除された行は

+ [added line] 
- [removed line] 

として識別されています私の誤りがどこにあるのかを見ているようですが、助けていただければ幸いです。

答えて

0

- と+は正規表現では特殊文字です。スラッシュでそれらをエスケープしてみてください - [^ \ - \ +]

+1

私は今、あなたのドキュメントにリンクすることはできませんが、それを読んだ場合、角括弧の中に置かれたときに特殊文字が特別な意味を失うことは明らかです。 。] '。しかし、 '^'が大括弧の中の最初の文字である場合、大括弧で囲まれていない文字はすべて一致する必要があります。 – UnchartedWaters

0

this question

を参照してください。私たちは否定を使用しているので、単純に問題のある行に

^(?!\+|\-).* 

(^[^-+]) 

を変更先読み演算子?!の場合は、末尾に.*を含める必要があります。一致しない場合は一致しません。

+0

または '^(?![+ - ])' ... – Toto

関連する問題