2012-01-14 4 views
1

Прочитали re.M, но до сих пор не знаю, как добиться этого (в разумном подходе)питон регулярное выражение, вырезать многострочный

Источник строка:

'ClassId=A1\n classname=A1\n \nClassId=B1\n classname=B1\n ' 

Вопрос в том, как разделить его на два элемента список ниже:

targe[0]='ClassId=A1\n classname=A1' 
targe[1]='ClassId=B1\n classname=B1' 

ответ

1

re.M, вероятно, не делает то, что вы думаете. См. docs. Вы могли бы искать re.S (re.DOTALL) вместо этого, но вам не нужно ни в этом случае:

import re 

string = 'ClassId=A1\n classname=A1\n \nClassId=B1\n classname=B1\n ' 

regex = re.compile('ClassId=\w+\n classname=\w+') 

matches = regex.findall(string) 
+0

Содержание исходной строки является динамическим, как это то, что я хочу, это разделение объекта Classid. Таким образом, может использоваться только «ClassId =». ClassID = 123 имя класса = 1 суперкласс = 3 InstanceId = 4 имя_класса = 5 Подпись = 6 ClassID = А123 имя класса = A1 суперкласс = А3 InstanceId = А4 имя_класса = А5 Надпись = A6 – brike

1

Может быть, вы можете использовать:

>>> import re 
>>> s = 'ClassId=A1\n classname=A1\n \nClassId=B1\n classname=B1\n ' 
>>> re.findall('ClassId=(.*)\n classname=(.*)', s)   
[('A1', 'A1'), ('B1', 'B1')] 

Это найти два поля, которые я предполагаю, что может измениться. Простое создание новой строки в regexp работает отлично.

Вы упоминаете re.M - этот флаг используется, когда вы хотите ^ и $, чтобы соответствовать каждой строке в строке, а не только в начале и в конце строки. Это не нужно здесь, так как вы можете просто поместить символы новой строки в свой шаблон.

1

Разделите две строки новой строки, разделенные одним или несколькими пробелами, затем разделите пробелы на пробел.

>>> import re 
>>> target=[p.rstrip() for p in re.split('\n +\n', 'ClassId=A1\n classname=A1\n \nClassId=B1\n classname=B1\n ')] 
>>> target[0] 
'ClassId=A1\n classname=A1' 
>>> target[1] 
'ClassId=B1\n classname=B1' 
>>> 
1

Вы были на правильном пути с 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'] 
+0

содержание динамическое, код – brike

+0

@brike. Я обновил свой ответ с более общим решением. – ekhumoro

+0

спасибо, я разработал решение. re.S работает для меня, на самом деле мой вопрос заключается в том, как включить '\ n' в результат соответствия регулярному выражению. – brike

Смежные вопросы