2017-01-17 9 views
0

私はPythonを使用して、複数の行でいくつかのファイルを解析し、re.findall()を使って正規表現を実行しています。先行する文字列を持たない文字列と一致する正規表現

文字列 "no foo"が "bar"の前にない限り、文字列 "bar"と行を一致させようとしています。言い換えれば、 "bar"にはマッチしますが、 "no foo bar"にはマッチしません。 "bar"が "no foo bar"の外側に表示された場合、それは一致するはずです。

入力:

1. candy bar 1 
2. no bar stool 
3. no foo bar here 
4. foo barred 
5. still no foo bar. 
6. foo bar! 
7. foobar! 
8. tricky no foo bar but has bar again 

所望の出力:

1. candy bar 1 
2. no bar stool 
4. foo barred 
6. foo bar! 
7. foobar! 
8. tricky no foo bar but has bar again 

これは私がしようとしているが、任意の成功を持っていなかった表現のようになります。

(^|[^no foo ])bar 

コード:

patterns = ["XXX", "(^|[^no foo ])bar"] 
joinedpatterns = "|".join(patterns) 
for line in lines: 
    for match in re.findall(joinedpatterns, line): 
     print 'found "%s"' % str(match) 
ネガティブルックの背後にあると呼ばれる何を達成しようとしている

答えて

3

for line in lines: 
    for match in re.findall('(?<!no foo)bar', line): 
     print('found "%s"' % str(line)) 
+0

この版画「ノーFOO FOOバーバーfooのバー」の行が一意である二回本家。 – Abra001

関連する問題