【问题标题】:How to add a set of alphanumeric contents into a list using python?如何使用 python 将一组字母数字内容添加到列表中?
【发布时间】:2014-12-12 16:15:01
【问题描述】:

我有一个日志文件,其中包含日期、时间、进程名称和数据包数据,格式为以空格分隔的字母数字格式。

示例行:

Date Time ProcessName ActivityName : 55 34 00 aa c9 00 11 45 55

我写了一个正则表达式来解析内容并获取数据包数据。现在我希望将这些数据包数据存储在一个列表中,以便我可以编写一个比较脚本来将其与一个新列表进行比较。我创建了一个新列表并在 for 循环中使用 append 来附加数据包数据的每个元素。我希望看到我的列表像 ['55','34','00','c9','00','11','45','55] 但我得到了['5','','5','','3','','4','','0','','0'等] .

我使用的for循环:

for packs in match.group(6):
       list.append(packs)

我应该如何让列表以我想要的格式填充值?

【问题讨论】:

    标签: python regex list append


    【解决方案1】:

    使用re.findall 函数。

    re.findall(r'(?<!\S)[A-Za-z\d]{2}(?!\S)', string)
    

    示例:

    >>> s = "Date Time ProcessName ActivityName : 55 34 00 aa c9 00 11 45 55"
    >>> re.findall(r'(?<!\S)[A-Za-z\d]{2}(?!\S)', s)
    ['55', '34', '00', 'aa', 'c9', '00', '11', '45', '55']
    

    说明:

    • (?&lt;!\S) Negative lookbehind 断言匹配不会以非空格字符开头。
    • [a-z\d]{2} 精确匹配小写字母或数字两次。
    • (?!\S) Negative lookahead 断言匹配后不会跟非空格字符。

    【讨论】:

    • 像魅力一样工作。谢谢 :) 我用 findall 开始了正则表达式,但后来我有一个不同的活动名称,在处理数据包数据之前我必须找出它。现在我已经完成了,我将这个 findall 包含在模式匹配的 if 条件中,并使用我已经写出的正则表达式。
    【解决方案2】:

    您可以按行执行此操作

    line = "Date Time ProcessName ActivityName : 55 34 00 aa c9 00 11 45 55"
    
    new_list = line.split(':')[1].split()
    

    【讨论】:

      【解决方案3】:

      遍历一个字符串一次会给出一个字符。您必须先拆分字符串:

      >>> data.split()
      ['55', '34', '00', 'aa', 'c9', '00', '11', '45', '55']
      

      您还可以精确分隔符:

      >>> data.split(' ')
      ['55', '34', '00', 'aa', 'c9', '00', '11', '45', '55']
      

      如果您想使用正则表达式,请参阅 Avinash Raj 的回答。否则,如果行的形式始终相同,则只有通过拆分才能获得数字:

      >>> line.split(' : ')[1].split(' ')
      ['55', '34', '00', 'aa', 'c9', '00', '11', '45', '55']
      

      【讨论】:

        【解决方案4】:

        您最好使用字符串进行比较。你可以使用

        ...
        list.append(...)
        DATA=''.join(list)
        

        然后你会得到这样的字符串:'553400c90011...'

        【讨论】:

          【解决方案5】:

          只需修改您的旧正则表达式并添加[0].split() 即可获得您想要的结果。

          import re
          x="Date Time ProcessName ActivityName : 55 34 00 aa c9 00 11 45 55"
          print re.findall(r"(?<=:)\s*([\da-zA-Z]{2}(?:\s[\da-zA-Z]{2})*)",x)[0].split()
          

          输出:['55', '34', '00', 'aa', 'c9', '00', '11', '45', '55']

          试试这个。这将为您提供您想要的清单。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-02-04
            • 2013-05-26
            • 2018-10-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-09
            相关资源
            最近更新 更多