如何在Python中使用正则表达式从电子邮件标题中提取主题?

如何在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:

我刚开始学习regex,在从邮件头中提取主题时遇到了一个问题

为了只保留每个标题的主题,同时忽略“Re:”和“Fwd:”(不区分大小写),我使用了下面的正则表达式,它能够突出显示所有无用的部分

/(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和“”时有效