我正在尝试解析OS X mdls命令的输出.对于某些键,值是值列表.我需要正确捕获这些键值对.所有值列表都以a开头,(然后以a结尾).
我需要能够遍历所有键值对,以便我可以正确地解析多个输出(即mdls运行多个文件以产生单个输出,其中一个文件的元数据结束而另一个文件的开始没有区别) .我在下面有一些示例代码.
有没有更有效的方法来做到这一点?
import re
mdls_output = """kMDItemAuthors = (
margheim
)
kMDItemContentCreationDate = 2015-07-10 14:41:01 +0000
kMDItemContentModificationDate = 2015-07-10 14:41:01 +0000
kMDItemContentType = "com.adobe.pdf"
kMDItemContentTypeTree = (
"com.adobe.pdf",
"public.data",
"public.item",
"public.composite-content",
"public.content"
)
kMDItemCreator = "Safari"
kMDItemDateAdded = 2015-07-10 14:41:01 +0000
"""
mdls_lists = re.findall(r"^\w+\s+=\s\(\n.*?\n\)$", mdls_output, re.S | re.M)
single_line_lists = [re.sub(r'\s+', ' ', x.strip()) for x in mdls_lists]
for i, mdls_list in enumerate(mdls_lists):
mdls_output = mdls_output.replace(mdls_list, single_line_lists[i])
print(mdls_output)
Run Code Online (Sandbox Code Playgroud)
您可以利用 python 的正则表达式替代品,它可以将函数作为替换字符串。对于与匹配对象的每次匹配,都会调用该函数。返回的字符串替换匹配项。
def myfn(m):
return re.sub(r'\s+', ' ', m.group().strip())
pat = re.compile(r"^\w+\s+=\s\(\n.*?\n\)$", re.S | re.M)
mdls_output = pat.sub(myfn, mdls_output)
Run Code Online (Sandbox Code Playgroud)