需要Python Regex帮助

时间:2016-07-05 13:19:24

标签: python regex

我正在尝试从文本文件中提取数据。 对于Jon 2013 trans的排队' 35。 (P)'我想提取(35,2013,(P))。

在此35是文件编号,2015是文件年,(P)表示优先权文件。

文档编号后面是文档年份,如果文档具有高优先级,则它们最后有(P)。

文档可能没有高优先级,并且最终不包含(P)。 2014年Sansa的前 - ' 31填补了#39; 在这里我想提取(31,2014,'')

我有一个包含文档信息的字符串。问题是字符串是连接的,并且在单个字符串中有多个文档的信息。

line =' 35 Jon 2013 trans。 (P)Sansa 2014年31日填补了32a Arya 2014空白345的Bran 2011密封,(P)'

我编写了以下代码,但它无法正常运行。

rgx = r'(\d{1,9})\s* OF \s*[A-Za-z]+\s*([1,2]\d{3}).*?(\(P\))?'
rgx2 = r'(\d{1,9})\s* OF \s*[A-Za-z]+\s*([1,2]\d{3}).*?(\(P\))'
line = '35 of Jon 2013 trans. (P) 31 of Sansa 2014 filled 3232 of Arya 2014 empty 345 of Bran 2011 sealed, (P)'

x = re.findall(rgx, line, re.IGNORECASE)
for i in x:
    print i
print 'Output by rgx2'
x = re.findall(rgx2, line, re.IGNORECASE)
for i in x:
    print i

此代码生成的输出: -

('35', '2013', '')
('31', '2014', '')
('3232', '2014', '')
('345', '2011', '')
Output by rgx2
('35', '2013', '(P)')
('31', '2014', '(P)') 

虽然第一个正则表达式能够正确捕获文档ID和文档年份,但它无法提取(P)类型,因为我正在使用"(P)?"。 第二个正则表达式的问题在于我正在使用"。*?(P)"找到P类型,它会导致错误的数据。

我想要的正确数据输出是

 ('35', '2013', '(P)')
 ('31', '2014', '')
 ('3232', '2014', '')
 ('345', '2011', '(P)')

任何人都可以提出更好的正则表达式。 请帮忙 !

2 个答案:

答案 0 :(得分:3)

这可以按照您的意愿运行:

import re

reg = r'(\d+)[^\d]*(\d+)[^\d|\(]*(\(P\))*'
line = '35 of Jon 2013 trans. (P) 31 of Sansa 2014 filled 3232 of Arya 2014 empty 345 of Bran 2011 sealed, (P)'

print 'Output by reg'    
for _ in re.findall(reg, line, re.IGNORECASE):
    print _

答案 1 :(得分:2)

试试这个正则表达式:

(\d+) of [a-zA-Z]+ (\d+) [a-zA-Z.]+(?:[,]? (\(P\)))?