从python文件解析结构化数据
该文件具有以下格式: 组件名称-版本-author@email.com-带有新行和其他空白字符的多行注释从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
\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