使用single_line列表字符串有效地替换多行列表字符串

时间:2015-07-10 16:46:52

标签: python regex

我正在尝试解析OS X的mdls命令的输出。对于某些键,值是值列表。我需要正确捕获这些键值对。所有值列表都以(开头,然后以)结尾。

我需要能够遍历所有键值对,以便我可以正确地解析多个输出(即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)

1 个答案:

答案 0 :(得分:2)

你可以利用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)