将一行由标记和空格分隔的数字拆分并存储到元组中的最佳方法是什么?

2024-03-28 09:33:50 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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


Tags: thetxtdatawithline数字openfile
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]。你知道吗

首先,编写for line in file:代码要简单得多 你可以用Martijn的正则表达式来计算数字。你知道吗

for line in file:
    marker = line.split()[-1]
    numbers = re.findall(r'\b(\d+)\s*:\s*(\d+)\b', line)

嗯。。。正则表达式?为什么?你知道吗

这样怎么样:

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

……但最后一块场地(四区、体育场)呢?不过,你现在应该可以应付了。。。你知道吗

相关问题 更多 >