【问题标题】:String parsing in Python with various unique cases具有各种独特情况的 Python 中的字符串解析
【发布时间】:2012-10-04 13:01:17
【问题描述】:

我的目标是将字符串转换为字典。下面是它的样子:

[exploit] => 1
[hits] => 1
[completed] => 1
[is_malware] => 1
[summary] => 26.0@13965: suspicious.warning: object contains JavaScript
76.0@14467: suspicious.obfuscation using eval
76.0@14467: suspicious.obfuscation using String.fromCharCode

[severity] => 4
[engine] => 60

所以我尝试了几种方法来做到这一点,第一次尝试是split\n,但我遇到了 [summary] 的内容被拆分的问题,因此不起作用。然后我的第二次尝试是split => 但是我遇到的问题是,一旦我在 => 处拆分它就不会知道它必须在 \n 处拆分下一个键。本质上它最终应该看起来像这样 {exploit:1, hits:1, completed:1....} 以此类推

任何帮助将不胜感激。

【问题讨论】:

    标签: python string parsing


    【解决方案1】:

    你可以使用re.findall来解析文本:

    >>> import re
    >>> re.findall('\[([^]]+)\] => (.*?)(?=\n\[|$)', s, re.S)
    [('exploit', '1'), ('hits', '1'), ('completed', '1'), ('is_malware', '1'), ('summary', '26.0@13965: suspicious.warning: object contains JavaScript\n76.0@14467: suspicious.obfuscation using eval\n76.0@14467: suspicious.obfuscation using String.fromCharCode\n'), ('severity', '4'), ('engine', '60')]
    

    您可以通过调用dict 将这些值放入字典中。

    >>> dict(re.findall('\[([^]]+)\] => (.*?)(?=\n\[|$)', s, re.S))
    {'engine': '60', 'hits': '1', 'severity': '4', 'is_malware': '1', 'summary': '26.0@13965: suspicious.warning: object contains JavaScript\n76.0@14467: suspicious.obfuscation using eval\n76.0@14467: suspicious.obfuscation using String.fromCharCode\n', 'exploit': '1', 'completed': '1'}
    

    【讨论】:

    • 这与最后一个条目不匹配 [engine]
    • 是的,这是一个棘手的问题,我不会费心把它放在一个银弹正则表达式中 - 特别是如果内容可能会发生变化。
    • 我有一个小问题。在运行代码时,我只得到以下结果: [('engine', '60')] 其他一切都消失了。
    • @Shelby.S 然后不是向我们展示您看到的字符,而是向我们展示repr(your_total_string) 的输出,(repr() 显示所有隐藏的换行符等可能阻止的字符是建议一个像样的正则表达式)
    【解决方案2】:
    total_string = """\
    [exploit] => 1
    [hits] => 1
    [completed] => 1
    [is_malware] => 1
    [summary] => 26.0@13965: suspicious.warning: object contains JavaScript
    76.0@14467: suspicious.obfuscation using eval
    76.0@14467: suspicious.obfuscation using String.fromCharCode
    
    [severity] => 4
    [engine] => 60
    """
    
    import re
    
    pattern_RE = '\[([^]]+)\] => (.*?)(?=\n\[|$)'
    report_dict = dict(re.findall(pattern_RE, total_string, re.S))
    
    for k, v in report_dict.items():
        print('[{}]: {}'.format(k, v))
    
    print(report_dict)
    

    现在您向我们展示的是这个,但可能隐藏了换行符和回车符。对于我们所看到的,正则表达式似乎没问题。

    {   'engine': '60', 
        'hits': '1', 
        'severity': '4', 
        'is_malware': '1', 
        'summary': '(all three captured)',
        'exploit': '1', 
        'completed': '1'
    }
    

    因此,如果正则表达式没有捕捉到这一点,则 total_string 的 repr() 必须与您粘贴的内容略有不同(可能是尾随换行符或其他内容)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多