Я пытаюсь сопоставить несколько блоков последовательных похожих строк, используя регулярное выражение. Точнее, я пытаюсь соответствовать несколько блоков в файле какСогласование нескольких строк с Python
H 0 0 0
O 0 0 1
H 0 1 1
, который появляется несколько раз в файле с различными значениями (для тех из вас, кто интересуется, я пытаюсь захватить вывод геометрии молекул по программа оптимизации геометрии квантовой химии).
Я попытался регулярное выражение, как
import re
# atom x y z
>>> my_re = r'(\s*(\w+)\s+(\d+)\s+(\d+)\s+(\d+)\n)+'
>>> my_string = 'lorem ipsum\nH 0 0 0\nO 0 0 1\nH 0 1 1\nlorem ipsum'
>>> re.findall(my_re, my_string)
[('H 0 1 1\n', 'H', '0', '1', '1')]
Вместо согласования блока целой молекулы, она совпадает только последнюю строку блока. Если удалить окончательный +
, регулярное выражение затем сопоставляет все строки блока по отдельности, т.е.
[('H 0 0 0\n', 'H', '0', '0', '0'),
('O 0 0 1\n', 'O', '0', '0', '1'),
('H 0 1 1\n', 'H', '0', '1', '1')]
Мой регулярное выражение рад соответствовать последовательные строки, если я дублировать его, например,
>>> re.findall(my_re*3, a)
[('H 0 0 0\n', 'H', '0', '0', '0',
'O 0 0 1\n', 'O', '0', '0', '1',
'H 0 1 1\n', 'H', '0', '1', '1')]
Что дает результаты, которые я хочу, однако, я не знаю длину блока, мне нужно, чтобы соответствовать заранее. Как я могу исправить свое регулярное выражение для соответствия нескольким последовательным строкам?
Итак, проблема с вашим вторым примером, который, кажется, работает, заключается в том, что у вас есть список кортежей, а не только один кортеж? Какой выход вы хотите? –
Я хочу сопоставить несколько экземпляров блока, и, таким образом, список кортежей не говорит мне, какие кортежи должны быть в каком блоке. Таким образом, мне понравился список из нескольких кортежей, каждый кортеж, соответствующий блоку. –