我有逐行文本,其中包含许多字段名称及其值分隔:,如果任何行没有任何字段值,则该字段将不存在于该行中 例如
First line:
A:30 B: 40 TS:1/1/1990 22:22:22
Second line
A:30 TS:1/1/1990 22:22:22
third line
A:30 B: 40
但是确认在单行中最多可以有3个字段,它们的名称将是A,B,TS。 在为此编写python脚本时,我面临以下问题: 1)我必须从每一行中提取哪些字段存在以及它们的值是什么 2)字段TS的字段值也有分隔符''(SPACE)。因此无法检索TS的完整值(1/1/1990 22:22:22)
输出值应该像那样提取
First LIne:
A=30
B=40
TS=1/1/1990 22:22:22
Second Line:
A=30
TS=1/1/1990 22:22:22
Third Line
A=30
B=40
请帮我解决这个问题。
答案 0 :(得分:2)
import re
a = ["A:30 B: 40 TS:1/1/1990 22:22:22", "A:30 TS:1/1/1990 22:22:22", "A:30 B: 40"]
regex = re.compile(r"^\s*(?:(A)\s*:\s*(\d+))?\s*(?:(B)\s*:\s*(\d+))?\s*(?:(TS)\s*:\s*(.*))?$")
for item in a:
matches = regex.search(item).groups()
print {k:v for k,v in zip(matches[::2], matches[1::2]) if k}
将输出
{'A': '30', 'B': '40', 'TS': '1/1/1990 22:22:22'}
{'A': '30', 'TS': '1/1/1990 22:22:22'}
{'A': '30', 'B': '40'}
正则表达式的解释:
^\s* # match start of string, optional whitespace
(?: # match the following (optionally, see below)
(A) # identifier A --> backreference 1
\s*:\s* # optional whitespace, :, optional whitespace
(\d+) # any number --> backreference 2
)? # end of optional group
\s* # optional whitespace
(?:(B)\s*:\s*(\d+))?\s* # same with identifier B and number --> backrefs 3 and 4
(?:(TS)\s*:\s*(.*))? # same with id. TS and anything that follows --> 5 and 6
$ # end of string
答案 1 :(得分:1)
你可以使用正则表达式,如果每次都假定订单相同,那么这样的话会起作用,否则如果你不确定订单,就必须单独匹配每个部分。
import re
def parseInput(input):
m = re.match(r"A:\s*(\d+)\s*B:\s*(\d+)\s*TS:(.+)", input)
return {"A": m.group(1), "B": m.group(2), "TS": m.group(3)}
print parseInput("A:30 B: 40 TS:1/1/1990 22:22:22")
打印出{'A': '30', 'B': '40', 'TS': '1/1/1990 22:22:22'}
这只是一个包含值的字典。
P.S。你应该接受一些答案并熟悉网站的礼仪,人们会更愿意帮助你。