我正在使用正则表达式来解析某些模式的文件。但是,如果我的数据中间有一些空格,我最终会得到错误的数据。 我有这种格式的数据:
067 000100 A
067 000200 B
067 000300 C
067 000400 D
067 000500 E
067 000600 F
我正在尝试获取前两个字符串,第二个字符串的中间两位数字和这样的值:(有些情况下我可能有7位数字,这就是为什么在这种情况下可以使用一个正则表达式最后的额外数字)
('67 000100 ', '01', 'A')
我使用以下正则表达式:
qnum = r'067'
subq = r' .00' #using . because I am not sure if there's one space or two!
fmt = r'(?sm)^(' + qnum + subq + r'(..)...)\s*(.*?)\s*$'
#data is a string with all those values and \n
result = re.findall(fmt,data, re.I)
但最后我最终得到以下结论:
('67 000100 ', '01', 'A')
('67 000200 ', '02', 'B')
('67 000300 ', '30', 'C')
如何获得正确的标题,以便中间只有“一个空格”,还有正确的中间数字?
答案 0 :(得分:0)
我可以尝试这种方式:
#!/usr/bin/python
import re
s = """
067 000100 A
067 000200 B
067 000300 C
067 000400 D
067 000500 E
067 000600 F
"""
for line in s.split('\n'):
if line.split():
m = re.match("(\d+\s+\d{2}(\d{2})\d{2})\s+(\S)", line)
print m.groups()
输出:
('067 000100', '01', 'A')
('067 000200', '02', 'B')
('067 000300', '03', 'C')
('067 000400', '04', 'D')
('067 000500', '05', 'E')
('067 000600', '06', 'F')
答案 1 :(得分:0)
怎么样
>>> subq = r'\s*00'
>>> fmt = r'(?sm)^(' + qnum + subq + r'(..)...)\s*(.*?)\s*$'
>>> result = re.findall(fmt,data, re.I)
>>> result
[('067 000600 ', '06', 'F')]
更改
subq = r'\s*00'
由于您不确定使用的空格数\s*
是否匹配任意数量的空格答案 2 :(得分:0)
.
并不代表可选字符;它只是意味着一个角色。您需要.
。
\s+