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

tos*_*o92 -1 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
Run Code Online (Sandbox Code Playgroud)

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

我已经尝试过以下正则表达式:

-----Message d'origine-----[\s\S]*?[\r\n]
Run Code Online (Sandbox Code Playgroud)

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

-----Message d'origine-----[\s\S]*?Hi
Run Code Online (Sandbox Code Playgroud)

有谁可以帮助我解决问题所在,以及如何使用carriage returnempty new line

谢谢 :)

Wik*_*żew 5

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

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

参见regex演示。该(?:\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)
Run Code Online (Sandbox Code Playgroud)

注意,当使用(= 标志)时,[\s\S]它等于.在正则表达式中。re.Sre.DOTALL

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

s = re.sub(r"-----Message d'origine-----.*(?:\r?\n(?!\r?\n).*)*\s*", "", s)
Run Code Online (Sandbox Code Playgroud)

请参阅此正则表达式演示。请勿在此模式下使用re.S/ re.DOTALL

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

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