Вы были на правильном пути с re.M
, так как это позволит вам эффективно использовать ^
и $
.
Вот один из возможных способов добиться того, что вы хотите:
>>> import re
>>>
>>> s = 'ClassId=A1\n classname=A1\n \nClassId=B1\n classname=B1\n '
>>> r = re.compile(r'^ClassId=.*$\s*classname=.*$', re.M)
>>> r.findall(s)
['ClassId=A1\n classname=A1', 'ClassId=B1\n classname=B1']
UPDATE
Ниже приводится более общее решение, которое разбивает текст на блоки строк, которые начинаются с ClassId
линии.
import re, pprint
s = """\
ClassId=123
classname=1
superclass=3
InstanceId=4
classname=5
Caption=6
ClassId=A123
classname=A1
superclass=A3
InstanceId=A4
classname=A5
Caption=A6
ClassId=B999
ClassId=
ClassId=A123 classname=A1
superclass=A3
"""
r = re.compile(r'^ClassId=.*?(?:(?=^ClassId=)|\Z)', re.M | re.S)
pprint.pprint(r.findall(s))
Выход:
['ClassId=123\n classname=1\n superclass=3\n InstanceId=4\n classname=5\n Caption=6\n',
'ClassId=A123\n classname=A1\n superclass=A3\nInstanceId=A4\n classname=A5\n Caption=A6\n',
'ClassId=B999\n',
'ClassId=\n',
'ClassId=A123 classname=A1\nsuperclass=A3\n']
Содержание исходной строки является динамическим, как это то, что я хочу, это разделение объекта Classid. Таким образом, может использоваться только «ClassId =». ClassID = 123 имя класса = 1 суперкласс = 3 InstanceId = 4 имя_класса = 5 Подпись = 6 ClassID = А123 имя класса = A1 суперкласс = А3 InstanceId = А4 имя_класса = А5 Надпись = A6 – brike