【问题标题】:How to organise specially formatted text to a list (on python)如何将特殊格式的文本组织到列表中(在 python 上)
【发布时间】:2013-02-20 14:33:39
【问题描述】:

我有包含航班路线代码的数据。 它有很多这样的字符串:

routing = 'PBI-FLL/FMY/JAX/MIA/ORL-PNS/TPA-SRQ-CLE/CHI/HOU/WAS-DEN-ELP' 

我需要得到这样的字符串列表:

routinglist =  [['PBI'], ['FLL','FMY','JAX','MIA','ORL'], ['PNS','TPA'], ['SRQ'], ['CLE','CHI','HOU','WAS'], ['DEN']]

我写了这段代码,但它很复杂,不能按需要工作

routingrules = 'PBI-FLL/FMY/JAX/MIA/ORL-PNS/TPA-SRQ-CLE/CHI/HOU/WAS-DEN-ELP' 
airports = []   
nn = 0
few = ''
airportcount = 0

for simvol in routingrules:
    if (nn) % 4 == 0:
        previous = routingrules[nn:nn+3]
        if routingrules[nn+3:nn+4] == '/':
            few = few + previous + "1,2"

        elif routingrules[nn+3:nn+4] == '-':
            if few != '':
                airports.append([few + previous])
                airportcount = airportcount+1
                few = ''                
            else:
                airports.append([previous])
                airportcount = airportcount+1
        else:
            if few != '':
                airports.append([few + previous])
                airportcount = airportcount+1
                few = ''    

        nn = nn+1
    nn = nn+1 

print airports

打印出来

[['PBI'], ['FLL1,2FMY1,2JAX1,2MIA1,2ORL'], ['PNS1,2TPA'], ['SRQ'], ['CLE1,2CHI1,2HOU1,2WAS'], ['DEN']]

【问题讨论】:

    标签: python string algorithm list


    【解决方案1】:

    - 上拆分,然后在/ 上拆分每个组:

    [r.split('/') for r in routing.split('-')]
    

    这个输出:

    >>> routing = 'PBI-FLL/FMY/JAX/MIA/ORL-PNS/TPA-SRQ-CLE/CHI/HOU/WAS-DEN-ELP' 
    >>> [r.split('/') for r in routing.split('-')]
    [['PBI'], ['FLL', 'FMY', 'JAX', 'MIA', 'ORL'], ['PNS', 'TPA'], ['SRQ'], ['CLE', 'CHI', 'HOU', 'WAS'], ['DEN'], ['ELP']]
    

    与您的示例相比,这是最后一个额外的['ELP'] 条目,但我认为这是一个疏忽。再次删除它很容易。

    【讨论】:

    • 非常感谢。也许你可以帮忙 - 我还能做些什么来拆分另一个空格字符列表?我的意思是我需要类似 [r3.split(' ') for r3 in r2.split('/') for r2 in r1.split('-')]
    • @8am:.split() 的默认值是在空格上拆分,包括在拆分之前将多个空白字符合并为一个。列表推导从左到右工作,就好像 for 循环是嵌套的。所以[r3.split() for r2 in r1.split('-') for r3 in r2.split('/')] 应该可以正常工作。
    【解决方案2】:

    虽然这个问题可能(是)矫枉过正,pyparsing 在这里工作得很好。

    routing = 'PBI-FLL/FMY/JAX/MIA/ORL-PNS/TPA-SRQ-CLE/CHI/HOU/WAS-DEN-ELP' 
    
    from pyparsing import *
    block   = Group(delimitedList(Word(alphas), '/'))
    grammar = Group(delimitedList(block, '-'))
    
    print grammar.parseString(routing)
    

    打印:

    [[['PBI'], ['FLL', 'FMY', 'JAX', 'MIA', 'ORL'], ['PNS', 'TPA'], ['SRQ'], ['CLE', 'CHI', 'HOU', 'WAS'], ['DEN'], ['ELP']]]
    

    当您想扩展语法时,这里的优势就来了。通常这些问题一开始很简单,随着时间的推移变得越来越复杂,这里将语法与解析分开是很有用的。

    【讨论】:

    • 哦,我听过很多次提到 pyparsing,但从未见过它在实际中使用。这真是太好了。
    • @DanielRoseman 要开始使用,我会查看 O'Reilly 的书,它真的很有帮助。 Paul McGuire(作者)是该站点的常客,并尝试回答任何带有 pyparsing 标记的特定问题。我用这些问题来练习我将来可能遇到的更复杂的语法,祝你好运!
    猜你喜欢
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 2019-05-10
    • 2022-01-16
    • 1970-01-01
    • 2011-11-28
    相关资源
    最近更新 更多