2013-12-20 6 views
0

У меня есть следующий шаблон строки на языке Python для имени переменной сообщ:соответствия регулярных выражений и замены с рисунком

from:\t[xxxxxx]\n 
message:\tcontent_1\n 
created_time:\tyyyyy\n 
from:\t[xxxxxx]\n 
message:\tcontent_2\n 
created_time:\tyyyyy\n 
from:\t[xxxxxx]\n 
message:\tcontent_3\n 
created_time:\tyyyyy\n 
     . 
     . 
     . 
from:\t[xxxxxx]\n 
message:\tcontent_n\n 
created_time:\tyyyyy\n 

Я ищу для согласования является content_1, content_2, content_3, ... , content_n Чтобы заменить любой "\ п" внутри любого content_i с ""

К примеру некоторого content_i

sentence1\n sentence2\n sentence3

ожидаемый результат, как:

sentence1, sentence2, sentence3

, но я нашел проблему, когда я пытаюсь с

msg = re.sub(r"(\]\nmessage:.*?)\n", r"\1,", msg, re.M) 

Некоторые группы рисунка, он также заменить \ п между content_i и created_time с "," также, но я не хочу его заменять.

Мой вопрос, я хотел бы использовать модуль повторно для поиска \ п в каждом content_i и заменяя «» только.

Примечание: любой content_i может иметь много \ п внутри

ответ

1

Основе ваши данные, которые вы можете использовать следующие для достижения этой цели ,

>>> import re 
>>> def f_breaks(match): 
...  return match.group().replace('\n', ',') 
... 
>>> msg = 'YOUR STRING DATA' 
>>> re.sub(r'(?si)(?<=message:\t).*?(?=\ncreated_time:)', f_breaks, msg) 

См Working demo

1
import re 
pattern = re.compile(r"(?<=message:\t).*?(?=\ncreated_time:)", re.DOTALL) 
print map(lambda x:x.replace("\n", ","), pattern.findall(data)) 
0

Вы можете попробовать это:

#!/usr/bin/python 

import re 

msg = r''' 
from:\t[xxxxxx]\n 
message:\tsentence1\nsententce2\nsentence3\nsentence4\n 
created_time:\tyyyyy\n 
from:\t[xxxxxx]\n 
message:\tsentence1\nsententce2\nsentence3\n 
created_time:\tyyyyy\n 
''' 

print re.sub(r'(?s)(?<=]\\n\nmessage:\\t).*?(?=\\n\ncreated_time:)', 
    lambda m: m.group(0).replace(r'\n', ','), msg) 
Смежные вопросы