从python中的字符串中提取字段

时间:2010-11-04 08:41:59

标签: python

我有逐行文本,其中包含许多字段名称及其值分隔:,如果任何行没有任何字段值,则该字段将不存在于该行中 例如

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

请帮我解决这个问题。

2 个答案:

答案 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。你应该接受一些答案并熟悉网站的礼仪,人们会更愿意帮助你。