【问题标题】:How to sort lines based on specific pattern in that line using python如何使用python根据该行中的特定模式对行进行排序
【发布时间】:2014-09-18 14:04:29
【问题描述】:

我在文件中有这样的行

1)  /^void UART0_ErrInterrupt(void)$/;" kind:function line:1367 signature:(void)
2)  /^tUI8 UART0_Get_TIE_Flag( void )$/;" kind:function line:211 signature:( void )
3)  /^tUI8 UART1_Get_TIE_Flag( void )$/;" kind:function line:281 signature:( void )

我需要使用 python 对这些行进行排序。我需要根据行后的数字进行排序:在每一行中。例如在上面的行中,行的顺序应该是 2) , 3), 1) 以升序排列。我该怎么做?

【问题讨论】:

    标签: python sorting


    【解决方案1】:

    使用 sorted 和自定义键

    >>> import re
    >>> with open('file.txt') as f:
    ...     lines = sorted(f, key=lambda line: int(re.search(r"(?<=line:)\d+", line).group()))
    
    >>> for l in lines:
    ...     print l
    
    2)  /^tUI8 UART0_Get_TIE_Flag( void )$/;" kind:function line:211 signature:( void )
    
    3)  /^tUI8 UART1_Get_TIE_Flag( void )$/;" kind:function line:281 signature:( void )
    
    1)  /^void UART0_ErrInterrupt(void)$/;" kind:function line:1367 signature:(void)
    

    【讨论】:

    • 您可以完全删除.readlines() 调用,只需将f 传递给sorted()
    【解决方案2】:

    您可以定义一个函数来解释应该如何进行排序:

    def sortkey(line):
        # find the number after the first "line:" and convert it to an integer
        return int(re.search(r"(?<=line:)\d+", line).group())
    

    并将该函数传递给排序函数/方法:

    >>> sorted(lines, key=sortkey)
    ['2)  /^tUI8 UART0_Get_TIE_Flag( void )$/;" kind:function line:211 signature:( void )', 
     '3)  /^tUI8 UART1_Get_TIE_Flag( void )$/;" kind:function line:281 signature:( void )', 
     '1)  /^void UART0_ErrInterrupt(void)$/;" kind:function line:1367 signature:(void)']
    

    【讨论】:

    • 我尝试使用它,显示 AttributeError: 'NoneType' object has no attribute 'group'
    • @AabhaGeed:如果正则表达式找不到匹配项,您将收到 AttributeError,因此您必须定义如何对不匹配的行进行排序。我无法重现您的第二条错误消息。这段代码中没有任何内容试图调用整数对象,所以也许你做错了什么。
    • 我为行添加了过滤器。我摆脱了态度错误。 'int' 对象不可调用仍然存在
    • @AabhaGeed:嗯,你在哪里调用整数对象?哪一行触发了错误?
    • @AabhaGeed 您是否不小心创建了一个名为 int 的变量?检查int = something。 Python 不会阻止您覆盖内部名称。这可能会导致return int() 出现问题
    猜你喜欢
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 2014-08-11
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多