我想知道如何删除电子邮件中上一条消息的任何标题。有一个消息示例:
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 return和empty 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 return和empty new line?
谢谢 :)
您需要匹配直到第一次出现双换行符:
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) -一个换行符,之后没有另一个换行符.* -其余部分