Я хочу убедиться, что длинная строка может совпадать с несколькими регулярными выражениями одновременно.
У меня есть длинная многострочная строка, содержащая список файлов и некоторое содержимое файла.
DIR1\FILE1.EXT1 CONTENT11
DIR1\FILE1.EXT1 CONTENT12
DIR1\FILE1.EXT1 CONTENT13
DIR1\FILE2.EXT1 CONTENT21
DIR2\FILE3.EXT2 CONTENT31
DIR3\FILE3.EXT2 CONTENT11
Список обычно содержит сотни тысяч строк, иногда несколько миллионов.
Я хочу проверить, что список содержит предопределенные пары файл / контент:
FILE1 CONTENT11
FILE1 CONTENT12
FILE3 CONTENT11
Я знаю, что я можно проверить, что строка содержит все эти пары, сопоставив строку с некоторыми регулярными выражениями
"^\S*FILE1\S*\tCONTENT11$"
"^\S*FILE1\S*\tCONTENT12$"
"^\S*FILE3\S*\tCONTENT11$"
import re
def all_matching(str, rxs):
res = True
for rx in rxs:
p = re.compile(rx, re.M)
res = res and p.search(str)
return(res)
input1 = """DIR1\\FILE1.EXT1\tCONTENT11
DIR1\\FILE1.EXT1\tCONTENT12
DIR1\\FILE1.EXT1\tCONTENT13
DIR1\\FILE2.EXT1\tCONTENT21
DIR2\\FILE3.EXT2\tCONTENT31
DIR3\\FILE3.EXT2\tCONTENT11"""
input2 = """DIR1\\FILE1.EXT1\tCONTENT11
DIR1\\FILE1.EXT1\tCONTENT12
DIR1\\FILE1.EXT1\tCONTENT13
DIR1\\FILE2.EXT1\tCONTENT21
DIR2\\FILE3.EXT2\tCONTENT31"""
rxs = [r"^\S*FILE1\S*\tCONTENT11$",r"^\S*FILE1\S*\tCONTENT12$",r"^\S*FILE3\S*\tCONTENT11$"]
if all_matching(input1,rxs):
print("input1 matches all rxs") # excpected
else:
print("input1 do not match all rxs")
if all_matching(input2,rxs):
print("input2 matches all rxs")
else:
print("input2 do not match all rxs") # expected because input2 doesn't match wirh rxs[2]
ideone доступен здесь
Однако, как входные данные В моем случае строка очень длинная, я бы предпочел не запускать поиск много раз ...
Мне кажется, что можно изменить таким образом функцию all_matching.
Любая помощь будет очень признателен!
EDIT
прояснил проблему предоставленный образец кода