仅删除上一封电子邮件的开头

时间:2019-04-10 09:59:21

标签: python regex

我想知道如何删除电子邮件中上一封邮件的任何标题。有一个消息示例:

Something above

-----Message d'origine-----
De : Myself <myself@himself.com>
Envoyé : vendredi 8 mars 2019 14:30
À : Someone <someone@himself.com>
Cc : AnotherGuy <another@himself.com>
Objet : My bad I forgot how to do it

Hi,

blabla

我需要删除-----Message d'origine-----之前的carriage returnempty new line"Hi,"之间的所有内容。

我尝试了以下正则表达式:

-----Message d'origine-----[\s\S]*?[\r\n]

但是只有-----Message d'origine-----个匹配项,没有下面的其他行。但是,如果我改用"Hi,",则它将与其匹配的所有行:

-----Message d'origine-----[\s\S]*?Hi

有人可以帮助我解决问题在哪里以及如何使用carriage returnempty new line吗?

谢谢:)

1 个答案:

答案 0 :(得分:5)

您需要匹配直到第一次出现 double 换行符:

r"-----Message d'origine-----[\s\S]*?(?:\r?\n){2}"
                                     ^^^^^^^^^^^^

请参见regex demo(?:\r?\n){2}模式与CRLF或LF行尾的两次重复匹配。

示例Python代码:

import re
s = "YOUR STRING HERE"
s = re.sub(r"-----Message d'origine-----.*?(?:\r?\n){2}", '', s, flags=re.S)

请注意,使用[\s\S](= {.标志)时,正则表达式中的re.S等于re.DOTALL

如果您担心受非贪婪.*?模式影响的性能,请以

展开
s = re.sub(r"-----Message d'origine-----.*(?:\r?\n(?!\r?\n).*)*\s*", "", s)

请参见this regex demo。请勿将re.S / re.DOTALL与此模式配合使用!

[\s\S]*?(?:\r?\n){2}现在为.*(?:\r?\n(?!\r?\n).*)*

  • .*-该行的其余部分
  • (?:\r?\n(?!\r?\n).*)*-重复0次或更多次
    • \r?\n(?!\r?\n)-一个换行符,之后没有另一个换行符
    • .*-该行的其余部分