【问题标题】:Python string parsing from .txt从 .txt 解析 Python 字符串
【发布时间】:2015-03-05 18:59:28
【问题描述】:

我有以下形式的字符串:

}# => 2[1 HMDB00001 ,2 HMDB00002]
}# => 5[1 HMDB00001 ,2 HMDB00002, 3 HMDB00003 ,4 HMDB00004,5 HMDB00005]
}# => 1[1 HMDB00001]

在 .txt 文件中。我正在尝试使用带有正则表达式的 re.search() 在 python 列表中解析它们,但到目前为止没有成功。你可以猜到列表应该包含如下元素elements = ["1 HMDB00001", "2 HMDB00002", "3 HMDB00003"]。列表彼此独立。所以,解析时只考虑一行(eg. }# => 2[1 HMDB00001 ,2 HMDB00002])

【问题讨论】:

  • 添加您的不成功尝试

标签: python parsing


【解决方案1】:
(?<=[\[,])\s*(\d+ HMDB0+\d+)

改用re.findall。查看演示。

https://regex101.com/r/eS7gD7/19#python

import re
p = re.compile(r'(?<=[\[,])\s*(\d+ HMDB0+\d+)', re.IGNORECASE | re.MULTILINE)
test_str = "}# => 2[1 HMDB00001 ,2 HMDB00002]\n}# => 5[1 HMDB00001 ,2 HMDB00002, 3 HMDB00003 ,4 HMDB00004,5 HMDB00005]\n}# => 1[1 HMDB00001]"

re.findall(p, test_str)

【讨论】:

    【解决方案2】:

    这似乎有效,但鉴于您的问题,很难确定。您也许可以根据得到的答案拼凑出一个解决方案。

    import re
    
    strings = [
        '}# => 2[1 HMDB00001 ,2 HMDB00002]',
        '}# => 5[1 HMDB00001 ,2 HMDB00002, 3 HMDB00003 ,4 HMDB00004,5 HMDB00005]',
        '}# => 1[1 HMDB00001]',
    ]
    
    for s in strings:
        mat = re.search(r'\[(.*)\]', s)
        elements = map(str.strip, mat.group(1).split(','))
        print elements
    

    哪些输出:

    ['1 HMDB00001', '2 HMDB00002']
    ['1 HMDB00001', '2 HMDB00002', '3 HMDB00003', '4 HMDB00004', '5 HMDB00005']
    ['1 HMDB00001']
    

    【讨论】:

      【解决方案3】:

      假设您的模式是:一位数字,一个空格,HMDB,5 位数字,按此顺序。

      结果存储在每行的字典中。

      import re
      
      matches = {}
      with open('my_text_file.txt', 'r') as f:
          for num, line in enumerate(f):
              matches.update({num: re.findall(r'\d\sHMDB\d{5}', line)})
      
      print(matches)
      

      如果HMDB 可能不同,您可以使用r'\d\s[a-zA-Z]{4}\d{5}'

      【讨论】:

        猜你喜欢
        • 2011-09-11
        • 2021-10-29
        • 2016-06-29
        • 1970-01-01
        • 2023-01-31
        • 1970-01-01
        • 2015-10-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多