从python文件解析结构化数据

从python文件解析结构化数据,python,string,python-2.7,parsing,Python,String,Python 2.7,Parsing,该文件具有以下格式: 组件名称-版本-author@email.com-带有新行和其他空白字符的多行注释 \t…继续多行注释 组件名称2-版本-author2@email.com-可能包含新行和其他空白字符的多行注释 组件名称-版本-author@email.com-可能包含新行和其他空白字符的多行注释2 组件名称-版本-author2@email.com-可能包含新行和其他空白字符的多行注释2 等等 解析后,输出格式应按组件名称分组: output = [ "component_na

该文件具有以下格式:

组件名称-版本-author@email.com-带有新行和其他空白字符的多行注释
\t…继续多行注释
组件名称2-版本-author2@email.com-可能包含新行和其他空白字符的多行注释
组件名称-版本-author@email.com-可能包含新行和其他空白字符的多行注释2
组件名称-版本-author2@email.com-可能包含新行和其他空白字符的多行注释2
等等

解析后,输出格式应按组件名称分组:

output = [
     "component_name" -> ["version - author@email.com - comment 1", "version - author@email.com - comment 2", ...],
     "component_name2" -> [...],
     ...
]
目前,这是我到目前为止对其进行分析的内容:

reTemp = r"[\w\_\-]*( \- )(\d*\.?){3}( \- )[\w\d\_\-\.\@]*( \- )[\S ]*"
numData = 4
reFormat = re.compile(reTemp)

textFileLines = textFile.split("\n")
temp = [x.split(" - ", numData - 1) for x in textFileLines if re.search(reFormat, x)]
m = filter(None, temp) # remove all empty lists
group = groupby(m, lambda y: y[0].strip())
这适用于单行注释,但不适用于多行注释。此外,我不确定正则表达式是否是用于此目的的正确工具。有没有更好的方法来做这件事

编辑:

  • 多行注释在新行上用制表符分隔
    \t
    (例如,查看上面的第一个条目)
  • 注释是GIT提交消息,可以包含JSON或代码
  • 条目由换行符分隔

我不得不处理这样的结构化数据文件,最后编写了一个状态机来解析文件。类似这样的内容(粗略的伪代码):


您可能希望将文件格式形式化为语法,然后使用Python提供的众多语法之一来根据语法解释文件。

也许
csv
带有分隔符
'-'
@PatrickHaugh如何处理带有“-”的多行注释?一个好的正则表达式可以解决这个问题。但是,如果没有实际的示例输入,就很难推荐任何内容。我看到的
split(“-”
方法的问题是多行注释可以包含这个字符序列。顺便说一句,您当前的正则表达式可以写成
r“[\w-]*(\d*.?){3}(-)[-\w.@]*([\S]*”
我不得不处理这样的结构化数据文件,最后编写了一个状态机来解析文件。基本上,您循环遍历文件的每一行,检查该行是否与起始行的正则表达式匹配,如果匹配,则将数据保存在新的“记录”目录中。对于后面的每一行,检查它是否为新记录-如果不是,则将该行附加到当前记录的注释中。如果是新行,请将当前记录保存到列表中(已完成),并用此行创建一个新记录。@das-g它为我看到的多行注释
\t
添加了一个制表符分隔符。
for line in file:
    if line matches new_record_regex:
        records.append(record)
        record = {"version": field1, "author": field2, "comment": field3}
    else:
        record["comment"] += line