级联弦分裂,Python方式

2024-05-29 06:46:31 发布

您现在位置:Python中文网/ 问答频道 /正文

以来自IANA的以下格式为例:http://www.iana.org/assignments/language-subtag-registry

%%
Type: language
Subtag: aa
Description: Afar
Added: 2005-10-16
%%
Type: language
Subtag: ab
Description: Abkhazian
Added: 2005-10-16
Suppress-Script: Cyrl
%%
Type: language
Subtag: ae
Description: Avestan
Added: 2005-10-16
%%

假设我打开文件:

^{pr2}$

通常你会这样做

lan=all.split("%%") 

iterate lan和split("\n")然后迭代结果并拆分(“:”),有没有一种方法可以在python中一批完成而不需要迭代,并且输出仍然是这样的: [[["Type","language"],["Subtag", "ae"],...]...]?在


Tags: orghttpaddedwww格式typedescriptionlanguage
3条回答

Regexes,但我不明白这一点:

re.split('%%|:|\\n', string)

这里使用or|运算符链接了多个模式。在

如果每次拆分后得到的元素在语义上是不同的,那么在一次传递中就没有任何意义了。在

你可以从“:”开始,这样可以得到细粒度的数据,但是如果你不知道这些数据属于哪一类,那又有什么用呢?在

也就是说,你可以把所有的分离程度都放在一个发生器里,让它产生 包含数据的字典对象,准备好使用:

def iana_parse(data):
    for record in data.split("%%\n"):
        # skip empty records at file endings:
        if not record.strip():
            continue
        rec_data = {}
        for line in record.split("\n"):
            key, value = line.split(":")
            rec_data[key.strip()] = value.strip()
        yield rec_data

你可以按照你在评论中的要求做一句话-但正如我所说, 它可以写成一行中的单个表达式。它比上面的例子花费了更多的时间来编写,而且几乎不可能维护。上面例子中的代码在几行代码中展开了逻辑,这些代码被放在“不方便”的地方,也就是说,在你处理实际数据的地方不是内联的,为这两个任务提供了可读性和可维护性。在

也就是说,作为嵌套列表结构的解析可以这样完成:

^{pr2}$

作为单一理解:

raw = """\
%%
Type: language
Subtag: aa
Description: Afar
Added: 2005-10-16
%%
Type: language
Subtag: ab
Description: Abkhazian
Added: 2005-10-16
Suppress-Script: Cyrl
%%
Type: language
Subtag: ae
Description: Avestan
Added: 2005-10-16
%%"""


data = [
     dict(
         row.split(': ')
         for row in item_str.split("\n")
         if row  # required to avoid the empty lines which contained '%%'
     )
     for item_str in raw.split("%%") 
     if item_str  # required to avoid the empty items at the start and end
]
^{pr2}$

相关问题 更多 >

    热门问题