Я пишу парсер, и мне нужно l oop через строки файла, сопоставляя каждую строку с шаблоном регулярных выражений. При этом мне нужно сделать следующее:
with open(filename) as file:
for line in file.readlines():
for match in pattern.finditer(line):
for name, group in match.groupdict().items():
if group is not None:
if name == 'some_group_name':
""" do random stuff """
elif name == 'some_other_group':
""" do some other random stuff """
else: raise ParserError('Unknown group')
Сначала я анализирую файл, написанный от руки / человеком, а затем анализирую содержимое по-разному, в зависимости от типа содержимого.
Потому что мне нужно сделать этот вид "для каждой строки в ... для каждого совпадения в строке ... для каждого et c. Et c." Много раз я решал написать функцию генератора для генерации совпадений именованных групп, где группа не None, учитывая некоторый генератор входных данных и шаблон:
def match_gen(gen, pattern):
return (
(name, group) for chunk in gen
for match in pattern.finditer(chunk)
for name, group in match.groupdict().items()
if group is not None
)
Это чудесно, НО это не было Первая попытка, поскольку я сначала хотел вернуть объект dict, который затем мог бы выполнить итерацию (или индексировать с помощью ключей), я впервые попробовал:
def match_gen(gen, pattern):
return {
name: group for chunk in gen
for match in pattern.finditer(chunk)
for name, group in match.groupdict().items()
if group is not None
}
Почти так же, как и первый, за исключением адаптирован к пониманию диктата в соответствии с моим пониманием понимания диктата, что оказывается ошибочным, поскольку последнее решение не приводит к ошибкам, но создает словарь, который содержит только самый последний элемент, добавленный в понимании диктата.
Почему это так? и как нужно изменить приведенный выше код, чтобы правильно создать dict, содержащий все элементы, а не только последний?