使用regex / python匹配文本 - 在换行符处删除“= / r /”

时间:2013-05-07 18:59:03

标签: python regex

我有以下代码将一大块文本与电子邮件隔离开来:

for part in mail.walk():
    if part.get_content_type() == 'text/plain':
        content = part.get_payload()
        message = re.compile(r'\%(.+?)\%', re.DOTALL).findall(content)
        print message

这样可以完美地找到文本,但是当它prints时,我会得到这样的结果:

['Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras et erat libe=\r\
nro. Ut lacinia ante euismod nibh feugiat pellentesque. Suspendisse vestibul=\r\
...

如何删除每行末尾的=\r\?谢谢!

4 个答案:

答案 0 :(得分:0)

此代码应删除文本中的任何“= \ r \”。

result = re.sub("=\\\\r\\\\", "", searchText)

答案 1 :(得分:0)

我们能看到它开头的初始文本吗?

从我目前看到的情况来看,您可以修改代码以执行以下操作;

for part in mail.walk():
    if part.get_content_type() == 'text/plain':
        content = part.get_payload()
        message = re.compile(r'\%(.+?)\%', re.DOTALL).findall(content)
        # This will just substitue the '=\r\' with nothing.
        message = re.sub(r'=\\r\\', '', message)
        print message

答案 2 :(得分:0)

您正在使用此正则表达式:

message = re.compile(r'\%(.+?)\%', re.DOTALL).findall(content)

可能更好地说明:

message = re.findall(r'\%(.+?)\%', content, flags=re.DOTALL)

在任何一种情况下,findall都会生成一个字符串列表 - 而不是字符串作为结果。

如果您有字符串列表,则需要使用列表解析:

>>> me
['Lorem ipsum dolor sit amet, consectetur adipiscing elit.=\r', 'Ut lacinia ante euismod nibh feugiat pellentesque.=\r', 'Suspendisse vestibul=\r']
>>> [re.sub(r'=\r','',e) for e in me]
['Lorem ipsum dolor sit amet, consectetur adipiscing elit.', 'Ut lacinia ante euismod nibh feugiat pellentesque.', 'Suspendisse vestibul']

或者只使用strip或rstrip:

>>> [e.rstrip('\r') for e in me]
['Lorem ipsum dolor sit amet, consectetur adipiscing elit.', 'Ut lacinia ante euismod nibh feugiat pellentesque.', 'Suspendisse vestibul']

答案 3 :(得分:0)

如果print消息给你这个:

  

['Lorem ipsum dolor sit amet,consectetur adipiscing elit。 Cras et erat libe = \ r \ nro。 Ut lacinia ante euismod nibh feugiat pellentesque。 Suspendisse vestibul = \ r \ n

...然后您没有要删除的任何\字符或r字符。您有回车符,Python显示为\r(回车)字符。您还有新行,Python显示为\n

那是因为你看到了字符串的repr,而不是str。通常,print x打印str ...但str(或其他集合)的list包括repr,而不是str,或其每个元素。

如果您实际打印str,就像在print message[0]中一样,您会看到如下内容:

  

Lorem ipsum dolor坐下来,精神上的精神。 Cras et erat libe =   RO。 Ut lacinia ante euismod nibh feugiat pellentesque。 Suspendisse vestibul =

因此,您不想删除'\r\,或删除\r\n,或将\r\n替换为换行符或类似内容。字符串已经正确。 (如果需要,可以将Windows风格的\r\n换行符转换为Unix风格的\n,但您不需要。)

当然,除了每行末尾的=个字符。解决这个问题:

s.replace('=\r', '\r')

或者,为列表中的每个字符串修复它:

[s.replace('=\r', '\r') for s in message]