python - 如何匹配正则表达式中可能存在或不存在但如果匹配项不存在则具有占位符的字符串

标签 python regex python-3.x

假设我有一个如下形式的大文本文件

[Surname: "Gordon"]
[Name: "James"]
[Age: "13"]
[Weight: "46"]
[Height: "12"]
[Quote: "I want to be a pilot"]

[Name: "Monica"]
[Weight: "33"]
[Quote: "I am looking forward to christmas"]

一共有 8 个键,它们总是按照我的“姓氏”,“姓名”,“年龄”,“体重”,“高度”,“学校”,“ sibling ”,“报价”的顺序排列事先知道。如您所见,某些配置文件没有完整的变量集。您唯一可以确定的是名称。

我想创建一个 pandas 数据框,每个观察作为一行,每一列作为键。就詹姆斯而言,由于他没有“学校”和“ sibling ”中的条目,我希望这些单元格的条目是 numpy nan 对象。

我的尝试是对每个变量使用类似 (?:\[Surname:\"()\"\]) 的东西。但即使是单一的姓氏,我也会遇到问题。如果姓氏不存在,它只返回空列表而不返回占位符。

更新:

例如,我希望莫妮卡个人资料的返回是 ('','莫妮卡','','33','','','','我期待圣诞节')

最佳答案

您可以解析文件数据,对结果进行分组,然后传递给数据框:

import re
import pandas as pd
def group_results(d):
   _group = [d[0]]
   for a, b in d[1:]:
     if a == 'Name' and not any(c == 'Name' for c, _ in _group):
       _group.append([a, b])
     elif a == 'Surname' and any(c == 'Name' for c, _ in _group):
       yield _group
       _group = [[a, b]]
     else:
       if a == 'Name':
         yield _group
         _group = [[a, b]]
       else:
         _group.append([a, b])
   yield _group

headers = ["Surname","Name","Age","Weight","Height","School","Siblings","Quote"]
data = list(filter(None, [i.strip('\n') for i in open('filename.txt')]))
parsed = [(lambda x:[x[0], x[-1][1:-1]])(re.findall('(?<=^\[)\w+|".*?"(?=\]$)', i)) for i in data]
_grouped = list(map(dict, group_results(parsed)))
result = pd.DataFrame([[c.get(i, "") for i in headers] for c in _grouped], columns=headers)

输出:

  Surname    Name                ...                 Siblings                              Quote
0  Gordon   James                ...                                        I want to be a pilot
1          Monica                ...                           I am looking forward to christmas

[2 rows x 8 columns]

关于python - 如何匹配正则表达式中可能存在或不存在但如果匹配项不存在则具有占位符的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53134204/

相关文章:

RegEx SQL,发出转义引号

python - Pandas dataframe 隔离关键字下方的行

python - 为什么我的正则表达式找不到结果?

regex - 如何仅计算数字长度正则表达式

python - 删除或减少子图之间的空白区域

java - 正则表达式程序

python - 在python中查找文本文件中每个单词的频率

python - 如果两个字典有重复的键,则从列表中删除字典

python - 如何在 y 轴上手动或自动添加缺失的 y 标签,该标签与其他规则间隔不一致

python - 什么是计算数字列表百分比变化的最pythonic方法