Python读取文件并列出需要两个定界符的列表

时间:2018-10-08 21:08:25

标签: python regex

我正在尝试读取一个包含多行的文件,并将其内容转换为一个列表,其中行为列表,列为字符串,数字类型或其他列表,以便我可以访问各个元素并在以后执行计算。

给出一个包含以下内容的文件:

x1 1 (x1 y1 0.5) (x1 y2 0.5)
x2 5 (x2 y1 1.0) (x3 y1 1.0) (x4 y1 1.0)

读取文件并将其转换为列表列表后,应为:

input = [
  ['x1', 1, ['x1', 'y1', 0.5], ['x1', 'y2', 0.5]]
  ['x2', 5, ['x2', 'y1', 1.0], ['x3', 'y1', 1.0], ['x4', 'y1', 1.0]]
]

我尝试过使用csv.reader()并先用括号组定界,然后再返回并用空格定界,但由于我想要的原因,它变得凌乱且不正确。所以我想我应该尝试使用正则表达式,但是我不熟悉它。

3 个答案:

答案 0 :(得分:0)

您需要一个解析器:

import re
line = "x1 1 (x1 y1 0.5) (x1 y2 0.5)"
stack = []
for token in re.findall('[()]|[\w.]+', line):
    if token == '(':
        stack.append([])
    elif token == ')':
        c = stack.pop()
        stack[-1].append(c)
    else:
        try:
            token = float(token)
        except ValueError:
            pass
        stack[-1].append(token)
tokens = stack.pop()

答案 1 :(得分:0)

这符合您的需求吗?

x='x2 5 (x2 y1 1.0) (x3 y1 1.0) (x4 y1 1.0)'
[i.replace(')',"").split() for i in x.split('(')]
[['x2', '5'], ['x2', 'y1', '1.0'], ['x3', 'y1', '1.0'], ['x4', 'y1', '1.0']]

答案 2 :(得分:0)

对于最少的工作量,您可以使用ast.literal_evalre.sub一起提供帮助。可同时使用Python 2和3

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
  <div id="1" class="hideme">
    <div class="first">A</div>
    <div class="second">B</div>
  </div>
  <div id="2" class="hideme">
    <div class="first">A</div>
    <div class="second">B</div>
  </div>
  <div id="3" class="hideme">
    <div class="first">A</div>
    <div class="second">B</div>
  </div>
  <div id="4" class="hideme">
    <div class="first">A</div>
    <div class="second">B</div>
  </div>
</div>
from ast import literal_eval
from re import sub

def clean_and_parse(line):
  line = line.strip().replace(' ', ',')
  return literal_eval(sub(r"([a-z]\d+)", r'"\1"', line))

with open("somefile", "r") as f:
  inp = f.readlines()

parsed = map(clean_and_parse, inp)
print(list(parsed))

这基本上用逗号([('x1', 1, ('x1', 'y1', 0.5), ('x1', 'y2', 0.5)), ('x2', 5, ('x2', 'y1', 1.0), ('x3', 'y1', 1.0), ('x4', 'y1', 1.0))] => ' ')替换所有空格,并引用所有文本(',' => x1)。然后,它将字符串拆分为几行,并将其输入'x1'并逐行推入列表。