如何在Python中使用正则表达式从电子邮件标题中提取主题?
我刚开始学习regex,在从邮件头中提取主题时遇到了一个问题 为了只保留每个标题的主题,同时忽略“Re:”和“Fwd:”(不区分大小写),我使用了下面的正则表达式,它能够突出显示所有无用的部分如何在Python中使用正则表达式从电子邮件标题中提取主题?,python,regex,email,Python,Regex,Email,我刚开始学习regex,在从邮件头中提取主题时遇到了一个问题 为了只保留每个标题的主题,同时忽略“Re:”和“Fwd:”(不区分大小写),我使用了下面的正则表达式,它能够突出显示所有无用的部分 /(Subject: *)?(\bRE|FWD?)([:\[][0-9]?[ :\]]*)/ig 但是,我无法提取我想要的真实主题 Subject: Re: re[2]: RSVP Subject: Re: Fwd: Direct Access Application Subject: RE:
/(Subject: *)?(\bRE|FWD?)([:\[][0-9]?[ :\]]*)/ig
但是,我无法提取我想要的真实主题
Subject: Re: re[2]: RSVP
Subject: Re: Fwd: Direct Access Application
Subject: RE:
Subject: RE: Proposed Negotiation Strategy
Subject: RE: Re: RE: Case study option
Subject: RE: Staffing
我尝试了re.sub(…),但似乎不起作用。不确定这是否有帮助(我认为正则表达式中存在一些问题,但我无法解决),但在Python中,您不使用/ig
传递标志,您可以这样做:
re.sub('(Subject: *)?(\bRE|FWD?)([:\[][0-9]?[ :\]]*)',
subjectstring, '', flags = re.IGNORECASE)
你很接近!您要做的是使用捕获组获取您想要的比赛部分。这是您的正则表达式稍微修改过的地方:
/(?:Subject:\s*)?(?:\bRE|FWD?)(?:[:\[][0-9]?[ :\]]*)(.*)/ig
因此,您会注意到其中的3?:
。这意味着正则表达式引擎不会将这些括号内的匹配捕获到一个组中。但是,最后一部分是:(.*)
最后一部分是您想要的,并且在匹配的第一个捕获组中。这里是regex的另一个版本
import re
text = [
'Subject: Re: re[2]: RSVP',
'Subject: Re: Fwd: Direct Access Application',
'Subject: RE:',
'Subject: RE: Proposed Negotiation Strategy',
'Subject: RE: Re: RE: Case study option',
'Subject: RE: Staffing'
]
p = re.compile('([\[\(] *)?.*(RE?S?|FWD?|re\[\d+\]?) *([-:;)\]][ :;\])-]*|$)|\]+ *$', re.IGNORECASE)
for line in text:
print(p.sub('', line).strip())
这将为您提供以下输出:
RSVP
Direct Access Application
Proposed Negotiation Strategy
Case study option
Staffing
解释如下:
([\[\(] *)? # starting [ or (, followed by optional spaces
.*(RE|FWD|re\[\d\]?) * # Anything before RE or FW or FWD or re[number], followed by optional spaces
([-:;)\]][ :;\])-]+ $) # only count it as a Re or FWD if it is followed by
# : or - or ; or ] or ) or end of line
# (and after that you can have more of these symbols with
# spaces in between)
| # OR
\]+ *$ # match any trailing \] at end of line
# (we assume the brackets () occur around a whole Re/Fwd
# but the square brackets [] occur around the whole
# subject line)
希望这有帮助。谢谢你对“?:”的解释。但是,您提供的正则表达式只能排除一个“Re:”或“Fwd:”…您的解决方案在切换subjectstring和“”时有效