正则表达式匹配和替换模式

时间:2013-12-20 01:13:07

标签: python regex

我在Python语言中有一个以下字符串模式,用于变量名 msg

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中的任何“\ n”

例如某些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 之间的 \ n ,但我不想要替换它。

我的问题是,我想使用re模块在每个 content_i 中搜索 \ n ,并仅用“,”替换。

注意:任何 content_i 都可以包含许多 \ n

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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

答案 2 :(得分: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)