1

假设我有一个文本文件,其中的数字由冒号和空格分隔,如下所示。

0:-83 1: -51 2: -69 3: -82 4: -85 8: -90 9: -69 QUAD
0:-88 1: -88 2: -98 3: -75 4: -42 5: -71 6: -89 7: -28 8: -83 9: -78 STADIUM

一对定义为用冒号分隔的两个数字。空格任意打断成对的数字。

目前,我有以下内容。

with open('data.txt') as file:
  lines = file.read().splitlines()
for line in lines: 
  line = line[:-1]  
  # What is the regex I should be using? 
  # data = re.split(r'[:\s]',line) includes the space after the colon if it exists

解析文本文件的最佳方法是什么,以便每一行都存储为一个元组列表,其中每个元组都是一对?

4

3 回答 3

3

以下正则表达式将为您提供成组的数字对(包括减号):

r'\b(-?\d+)\s*:\s*(-?\d+)\b'

这匹配一个单词边界 ( \b),然后是一组数字(-前面有一个可选的减号),后跟一个由可选空格包围的冒号,然后是另一组带有可选减号的数字,然后是一个单词边界。

演示:

>>> import re
>>> numpairs = re.compile(r'\b(-?\d+)\s*:\s*(-?\d+)\b')
>>> example = '0:-83 1: -51 2: -69 3: -82 4: -85 8: -90 9: -69 QUAD'
>>> numpairs.findall(example)
[('0', '-83'), ('1', '-51'), ('2', '-69'), ('3', '-82'), ('4', '-85'), ('8', '-90'), ('9', '-69')]

您可能不想一次将所有行都写入内存;只需逐行循环您的文件:

import re
numpairs = re.compile(r'\b(-?\d+)\s*:\s*(-?\d+)\b')
with open('data.txt') as file:
    for line in file:
        for pair in numpairs.findall(line):
            print pair

您无需删除换行符即可使上述代码正常工作,但如果这样做,请line.strip()使用line[:-1].

于 2012-09-18T08:21:24.090 回答
1

嗯...正则表达式?为什么?

像这样的东西怎么样:

result = [] # list of tuples
for line in your_file:
    fields = line.split(':')
    first = int(fields[0].strip())
    fields = fields[1:] # remove first field
    for field in fields:
        last, new_first = [int(x.strip()) for x in field.split(':')]
        result.append((first, last))
        first = new_first

...但是最后一个字段(QUAD,STADION)呢?不过,你现在应该可以应付了……

于 2012-09-18T08:38:10.597 回答
0

首先,编码要简单得多for line in file: 您可以使用 Martijn 的正则表达式来获取数字。

for line in file:
    marker = line.split()[-1]
    numbers = re.findall(r'\b(\d+)\s*:\s*(\d+)\b', line)
于 2012-09-18T08:27:01.807 回答