使用python从文本文件中提取括在花括号中的值

时间:2013-12-20 07:01:24

标签: python regex

我在文本文件中有以下行:

0044xx aaa,bbb< +> 01/01/0017:53<&> {3.01} {00001} {xxx yyy DIFF} {(4.0-10.5)} {7.2}

等等

我正在尝试提取像:

这样的值
AAA is 0044xx aaa, bbb 

BBB is 01/01/0017:53

CCC is 3.01

DDD is 00001

EEE is xxx yyy

FFF is (4.0-10.5)

HHH is 7.2

我无法将CCC中的值从大括号中提取到HHH中。

我的脚本就像:

import sys

import re

import csv

def separateCodes(code):
    values = re.compile('.*?\{(.*?)\}.*?')
    field=values.findall(code)    

    for i in range(len(field)):
        print field[i]
    print"-------------------------"        

def handleError(self, record):
    raise    
with open('/xxx.TXT') as ABCfp:    
    PP=ABCfp.read()

PPwithNOrn=PP.replace('*\r','').replace('\n', '')
PPByMsg=PPwithNOrn.split('<~>')
print len(PPByMsg)

for i in range(len(PPByMsg)):

    AAA=""
    BBB=""
    CCC=""
    DDD=""
    EEE=""
    FFF=""
    GGG=""
    HHH=""

    print i,"=>",PPByMsg[i]
    if PPByMsg[i].find("<L>")!=-1:
        print "-----------------------"
        # AAA found
        AAA=PPByMsg[i].split('<L>  <+>')[0]
    # BBB found
    BBB=PPByMsg[i].split('<L>  <+>')[1].split('<&>')[0]
        # REST Found
    rest=separateCodes(PPByMsg[i].split('<L>  <+>')[1].split('<&>')[1])

因为我是python的新手无法前进。请建议一种提取这些值的方法。

3 个答案:

答案 0 :(得分:0)

相反如何:

a,b,c = re.split('<[+&]>', i)
bits = re.split('{(.*?)}', c)[1:-1]

bits将包含字符串最后一部分的标记:

>>> bits
[' 3.01', '', '00001 ', '', 'xxx yyy DIFF', '', '(4.0-10.5)', '', '7.2']
>>> a
'0044xx aaa, bbb '
>>> b
' 01/01/0017:53 '

答案 1 :(得分:0)

您可以使用单个正则表达式执行整个操作:

>>> t = '0044xx aaa, bbb <+> 01/01/0017:53 <&> { 3.01}{00001 }{xxx yyy DIFF}{(4.0-10.5)}{7.2}'
>>> re.search(r'(.*?)\s<\+>\s(.*?)\s<&>\s{(.*?)\}\{(.*?)\}\{(.*?) DIFF\}\{(.*?)\}\{(.*?)\}', t).groups()
('0044xx aaa, bbb', '01/01/0017:53', ' 3.01', '00001 ', 'xxx yyy', '(4.0-10.5)', '7.2')

您可以使用(?P<name>.*?)而不是(.*?)来扩展正则表达式,以提供命名结果:

>>> re.search(r'(?P<a>.*?)\s<\+>\s(?P<b>.*?)\s<&>\s{(?P<c>.*?)\}\{(?P<d>.*?)\}\{(?P<e>.*?) DIFF\}\{(?P<f>.*?)\}\{(?P<g>.*?)\}', t).groupdict()
{'a': '0044xx aaa, bbb', 'c': ' 3.01', 'b': '01/01/0017:53', 'e': 'xxx yyy', 'd': '00001 ', 'g': '7.2', 'f': '(4.0-10.5)'}

或者,使用zip或分组,例如:

>>> results = re.search(...).groups()
>>> resultdict = zip('abcdefg', results)
>>> a, b, c, d, e, f, g = results

答案 2 :(得分:0)

我完成了以下要求:

rest=separateCodes(PatientETLByMsg[i].split('<L>  <+>')[1].split('<&>')[1])

CCC=PPByMsg[i].split('{')[1].split('}')[0]
DDD=PPByMsg[i].split('}{')[1]
EEE=PPByMsg[i].split('}{')[2]
FFF=PPByMsg[i].split('}{')[3]
GGG=PPByMsg[i].split('}{')[4]
HHH=PPByMsg[i].split('}{')[5]
KKK=PPByMsg[i].split('}{')[6].split('}')[0]