【问题标题】:Parsing file with python用python解析文件
【发布时间】:2019-10-21 09:10:15
【问题描述】:

我正在尝试在 python 中解析一个文件。我有一个这样的文件:

ID number        Name
LOI_3456         Bacteria1       
HUI_6478         Bacteria1
PETY_3564        Bacteria1

所以首先我收集了每个细菌的所有 ID_number:

import re
f = open("file.tsv","r")
f.readline()
for line in f.readlines():
    line = li.rstrip("\n")
    line = li.rsplit("\t")
    ID_number = li[0]

现在在另一个文件中,我有这样的内容:

d2234 d45564 d223098 d50923 PETY_354_d3456 d76533
d2635 PETY_354 d88593 d324623 HUI_6478_d3553d35626
...

现在我在同一个脚本中得到了这个:

   cnt = 0
    f2 = open("file2","r")
    for li in f2.readlines():
        li = li.rstrip("\n")
        pattern_id_number = re.search(ID_number+'_\d+', li)
        if pattern_id number in li:
           print("line :",n, li)

但这不起作用。我想要的是保留与我的 pattern_id_member 匹配的行。

编辑:

当我这样做时:

if pattern_id :
   print(li)

而不是

if pattern_id in li:
   print(li)

什么都没有打印...

【问题讨论】:

  • 使用if pattern_id_number: 而不是if pattern_id number in li:。此外,您可以只使用for li in f2 来遍历file2 文件中的行。
  • 你是说第一个文件的ID号会包含在第二个文件中?
  • 第一个文件的 Id_number 出现在文件 2 的某些行上,但后面有一个下划线
  • 请注意:你在pattern_id_number = re.search(ID_number+'_\d+', li)中使用了pattern_id_number,然后你在if pattern_id number in li:中检查了pattern_id number。看到错字了吗?

标签: python regex file parsing


【解决方案1】:

我认为问题出在您在此处构造的正则表达式中:

pattern_id_number = re.search(ID_number+'_\d+', li)

Tout pattern_id_number 等于 HUI_6478,当你添加 \d+ 时,你会得到一个正则表达式:

HUI_6478_\d+

此正则表达式与您的第二个文件中的任何内容都不匹配。 我不知道所需的输出,但看起来您需要将正则表达式创建更新为:

pattern_id_number = re.search(ID_number + '_\w\d+', li)

然后你会得到一个输出:

line : d2635 PETY_354 d88593 d324623 HUI_6478_d3553d35626

编辑:是的,上面的 cmets 也是有效的,你需要有

if pattern_id_number:
   print("line :", li)

【讨论】:

  • 谢谢!太明显了……很抱歉给您带来不便
【解决方案2】:
import csv
import re
with open(r'C:\Users\widnows\Desktop\file1.csv', "r", encoding='utf-8') as f:
    reader = csv.reader(f)
    your_list = [e[0].strip().split(",")[0] for e in reader if e]
your_list[1:]

>>['LOI_3456', 'HUI_6478', 'PETY_3564Bacteria1']

import string

s = s = '''d2234 d45564 d223098 d50923 PETY_354_d3456 d76533
d2635 PETY_354 d88593 d324623 HUI_6478_d3553d35626'''

result = re.findall('|'.join(your_list[1:]), s.translate({ord(c): None for c in string.whitespace}))
result
>>['HUI_6478']

【讨论】:

    猜你喜欢
    • 2021-11-15
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2012-09-16
    • 2014-12-06
    • 2023-04-02
    相关资源
    最近更新 更多