2017-01-17 72 views
0

我使用python解析多行文件并使用re.findall()执行正则表达式。正则表达式匹配没有前面的字符串的字符串

我试图用字符串“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

这版画“富不富酒吧酒吧富巴” eventhough两次行是独一无二的。 – Abra001

相关问题