Python读取一系列parthesis中一个parthesis的第一个条目



我在一个csv文件中有数千行以下示例。文件的头如下所示:

文件头:

field1, field2, field3, field4

样本数据:

field1, field2, 1,"[("entryA"、"typeA")("entryB"、"typeB")("entryC"、"typeC"),("entryD"、"类型")]">

我的问题是如何提取field3并将其与每个括号的第一个条目配对,并将其置于以下格式?

我需要什么:

{"id"field3"entries": ["entryA", "entryB", "entryC", "entryD"]}

我的代码:

import pandas as pd
import re
df = pd.read_csv('file.csv')
id = df['field3']
entries = df['field4']
for row in entries:
    result = entries.str.findall("(?<=(').*?(?=',)")

当前输出:

当前的Regex工作,但是,我刚刚注意到,我有特殊的符号,如'('在我的条目影响匹配的结果(不需要的匹配)。

有个更好的办法。

import ast
s = ast.literal_eval(s)
entries = [a[0] for a in s]

后续

pandas没有帮助你。预处理数据,然后转换为pandas。看起来你想要的只是第三个字段和扩展后的第四个字段,所以我只保留了这些。

import re
import csv
import pandas as pd
headers = []
data = []
for row in csv.reader(open('file.csv')):
    if not headers:
        headers = row
    else:
        entries = [a[0] for a in ast.literal_eval(row[3]))
        data.append( [row[2], entries] )
df = pd.DataFrame(data, columns=['id','entries'])

你不需要re,使用ast.literal_eval

>>> s = "[('entryA', 'typeA'), ('entryB', 'typeB'), ('entryC', 'typeC'), ('entryD', 'typeD')]"
>>> from ast import literal_eval
>>> literal_eval(s)
[('entryA', 'typeA'), ('entryB', 'typeB'), ('entryC', 'typeC'), ('entryD', 'typeD')]
>>> out = [i[0] for i in literal_eval(s)]
>>> out
['entryA', 'entryB', 'entryC', 'entryD']

您需要使用前向和后向正则表达式来执行以下操作

s = "[('entryA', 'typeA'), ('entryB', 'typeB'), ('entryC', 'typeC'), ('entryD', 'typeD')]"
result = re.findall("(?<=(').*?(?=',)", s)
print(""entries":",result)

Lookahead: (?=EXPR)查找元素正前方的内容。
Lookbehind: (?<=EXPR)查看元素的正后方。

新版本:

result = df.field4.str.extractall("((?<=(').*?(?=',))").to_numpy().reshape(2, 4)

给出(为了测试目的添加了额外的行)

array([['entryA', 'entryB', 'entryC', 'entryD'],
       ['entryA1', 'entryB1', 'entryC1', 'entryD1']], dtype=object)

最新更新