2013-05-07 54 views
0

我有下面的代码,从电子邮件分离文本块:匹配的文本与正则表达式/蟒蛇 - 删除“=/R /”在换行

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\?谢谢!

+0

首先,你确定要删除'“= \ r \”',而不是删除''= \ r \ n''或将其替换为实际的换行符?其次,我很确定首先没有反斜杠或“r”字符 - 如果有的话,“repr”会显示为“libe = \\ r \\ n”,而不是“libe = \ r \ N'。有CR和换行符。 – abarnert 2013-05-07 19:24:47

回答

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 
+0

谢谢!工作很棒! – 2013-05-07 19:24:13

0

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

result = re.sub("=\\\\r\\\\", "", searchText) 
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'] 

或者只是使用带或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'] 
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 ...但list(或其他收集)的str包括repr,而不是str或其每个元素。

如果你真的打印str,如print message[0],你会看到这样的事情:

Lorem存有悲坐阿梅德,consectetur adipiscing ELIT。 Cras et erat libe ro = ro。 Ut lacinia ante euismod nibh feugiat pellentesque。Suspendisse VESTIBUL =

所以,你不想删除'\r\或删除\r\n,或用换行,或类似的东西代替\r\n。字符串已经是正确的。 (您可以\r\n换行转换为Windows风格,以Unix风格\n如果你想,但你不必。)

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

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

或者,要解决它的列表中的每个字符串:

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