使用分隔符解析文档并返回命名段

时间:2018-02-09 12:08:55

标签: python regex

我正在尝试解析具有不同类型分隔符的文本(例如---###)我想为这些分隔符命名(AWFW分别)并进一步从一个分隔符检索内容到下一个分隔符加上相应的标签。

例如:

test = """
0 test test test
---
1 test test test
1 test test test
###
2 test test test
---
3 test test test
###
4 test test test
"""

应该给:

[
    (None, '0 test test test'),
    ('AW', '1 test test test\n1 test test test'),
    ('FW', '2 test test test'),
    ('AW', '3 test test test'),
    ('FW', '4 test test test')
]

我有tried the following pattern(其中包括):

p = re.compile(r'(?P<AW>---)|(?P<FW>###)')

m = re.search(p, test)
print(m.groups())  # > ('---', None)

但我似乎无法检索相关信息。

背景

我想解析具有嵌套邮件的电子邮件。我在这里使用正则表达式的原因是因为那些分隔符并不总是相同所以我认为我可以使用一些正则表达式规则来检测它们。

From: b@example.com
To: a@example.com

Of course!

---- Original Message ---
From: a@example.com
To: b@example.com

Lunch today?

真实世界的例子

  

注意:此数据已公开(Enron data set) - 无需审查

任务是提取所有三条消息。这里的两个分隔符是

1) 
-----Original Message-----

2) 
---------------------- Forwarded by Vince J Kaminski/HOU/ECT on 05/02/2001 
05:16 PM ---------------------------

原始字符串:

Message-ID: <19476677.1075856436259.JavaMail.evans@thyme>
Date: Wed, 2 May 2001 07:41:00 -0700 (PDT)
From: vince.kaminski@enron.com
To: loleary@riskwaters.com
Subject: RE: EPRM 2001 Houston
Cc: vince.kaminski@enron.com, tanya.tamarchenko@enron.com, 
    shirley.crenshaw@enron.com
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Bcc: vince.kaminski@enron.com, tanya.tamarchenko@enron.com, 
    shirley.crenshaw@enron.com
X-From: Vince J Kaminski
X-To: <loleary@riskwaters.com>
X-cc: Vince J Kaminski, Tanya Tamarchenko, Shirley Crenshaw
X-bcc: 
X-Folder: \Vincent_Kaminski_Jun2001_3\Notes Folders\Sent
X-Origin: Kaminski-V
X-FileName: vkamins.nsf

Kind Regards

-----Original Message-----
From: Vince.J.Kaminski@enron.com [mailto:Vince.J.Kaminski@enron.com]
Sent: 02 May 2001 15:38
To: loleary@riskwaters.com
Cc: Vince.J.Kaminski@enron.com
Subject: Re: EPRM 2001 Houston

Kind Regards

---------------------- Forwarded by Vince J Kaminski/HOU/ECT on 05/02/2001 
05:16 PM ---------------------------


Rakesh Bharati@ENRON
05/02/2001 04:31 PM
To: Vince J Kaminski/HOU/ECT@ECT
cc:  
Subject: Default Probability

Kind Regards

1 个答案:

答案 0 :(得分:0)

据我所知,第一部分很简单,总是一样,甚至不需要正则表达式,你只想要

result = rawString.split('\n-----Original Message-----\n',1)

result[0]现在肯定包含第一部分。现在你只想分开剩下的部分:

result2 = re.split(r'\n---------------------- Forwarded by [^\n]* ---------------------------\n',result[1])

如果由于某种原因,某人在邮件本身中有此字符串,您可以加入result2[:-1],因为最后一次拆分确定您是第三部分。我估计这不会被要求。不幸的是,这里没有正确的拆分。