我知道正则表达式中的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方式来做到这一点?
由于
答案 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):