我在文本文件中有以下行:
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的新手无法前进。请建议一种提取这些值的方法。
答案 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]