我正在尝试读取一个包含多行的文件,并将其内容转换为一个列表,其中行为列表,列为字符串,数字类型或其他列表,以便我可以访问各个元素并在以后执行计算。
给出一个包含以下内容的文件:
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()并先用括号组定界,然后再返回并用空格定界,但由于我想要的原因,它变得凌乱且不正确。所以我想我应该尝试使用正则表达式,但是我不熟悉它。
答案 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_eval
与re.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'
并逐行推入列表。