检查所有列表项是否存在于行中(正则表达式)

时间:2014-08-11 11:10:04

标签: python regex

我知道正则表达式中的OR条件是“|” 例如

re.search(r"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)", line):

查找某行是否包含对月份的引用。

如果我们想要所有项目都存在于一行(或str)中怎么样?现在我有类似的东西

    if re.search(r"ERRO", line) and re.search(r"MainThread:", line):

但我可能想添加更多条件。此外,如果这些项目存在于列表中并且我们不想遍历列表,该怎么办?是否有一种pythonic方式来做到这一点?

由于

3 个答案:

答案 0 :(得分:2)

使用all它会懒惰地评估。

conditions = ["foo","bar"]

s = "foo bar"
print all(x in s.split()  for x in conditions)
True

l = ["fo","bar"]

s = "foo bar"
print all(x in s.split() for x in conditions)
False

如果你没有拆分单词,那么像fo这样的单词就会被认为是在行中这么分开,或者根据你认为在行中的内容进行拆分:

conditions = ["fo","bar"]

s = "foo bar"
print all(x in s  for x in conditions)
True

答案 1 :(得分:2)

and条件用正则表达式语言中的前瞻表达:

import re

print re.search(r'^(?=.*foo)(?=.*baz)(?=.*bar)', "foo and bar and baz")   # ok
print re.search(r'^(?=.*foo)(?=.*baz)(?=.*bar)', "foo and bar and spam")  # nope

如果您有关键字列表,则可以动态创建此正则表达式

keywords = 'foo', 'bar', 'baz'
regex = '^' + ''.join("(?=.*%s)" % s for s in keywords)

当然,如果您只查找文字字符串,all(word in string for word in words)会更简单(不一定更快)。

答案 2 :(得分:1)

您可以使用Python的in运算符:

if "ERRO" in line and "MainThread:" in line:

如果您将关键字保留在列表中,请使用all函数检查所有关键字:

keywords = ["ERRO", "MainThread", ...]    
if all(k in line for k in keywords):