python - 使用Python区分带一个点的线和带两个点的线

标签 python parsing separator

我有一个大文件,我想以某种方式对其进行格式化。文件输入示例:

DVL1    03220   NP_004412.2 VANGL2  02758   Q9ULK5  in vitro    12490194
PAX3    09421   NP_852124.1 MEOX2   02760   NP_005915.2 in vitro;yeast 2-hybrid 11423130
VANGL2  02758   Q9ULK5  MAGI3   11290   NP_001136254.1  in vitro;in vivo    15195140

这就是我希望它变成的样子:

DVL1    03220   NP_004412   VANGL2  02758   Q9ULK5
PAX3    09421   NP_852124   MEOX2   02760   NP_005915
VANGL2  02758   Q9ULK5  MAGI3   11290   NP_001136254

总结:

  • 如果该行有 1 个点,则该点及其后的数字将被删除并添加一个\t,因此输出行将只有 6 个制表符分隔值
  • 如果该行有 2 个点,这些点连同它们后面的数字一起被删除并添加一个\t,因此输出行将只有 6 个制表符分隔值
  • 如果该行没有点,则保留前 6 个制表符分隔值

目前我的想法是这样的:

for line in infile:
    if "." in line: # thought about this and a line.count('.') might be better, just wasn't capable to make it work
        transformed_line = line.replace('.', '\t', 2) # only replaces the dot; want to replace dot plus next first character
        columns = transformed_line.split('\t')
        outfile.write('\t'.join(columns[:8]) + '\n') # if i had a way to know the position of the dot(s), i could join only the desired columns
    else:
        columns = line.split('\t')
        outfile.write('\t'.join(columns[:5]) + '\n') # this is fine

希望我解释清楚。 感谢你们的努力。

最佳答案

import re
with open(filename,'r') as f:
    newlines=(re.sub(r'\.\d+','',old_line) for old_line in f)
    newlines=['\t'.join(line.split()[:6]) for line in newlines]

现在您有一个删除了“.number”部分的行列表。据我所知,您的问题并没有受到足够的限制,无法通过正则表达式使整个过程在 1 次通过中工作,但它可以与 2 次一起使用。

关于python - 使用Python区分带一个点的线和带两个点的线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11474528/

相关文章:

string - Clojure - 在不丢失分隔符的情况下拆分字符串

python - 将 pandas DataFrame 与 Series 进行比较

python - 为什么python对范围不严格?

python - 当Python繁忙时如何监控Tkinter按钮?

c++ - 什么是最好的 C++ LALR 解析器生成器,可以生成有意义的错误消息

r - 如何使用 R 将 ',' 设置为小数点分隔符

mysql - DBGrid 中的千位分隔符

python - 来自字典列表或列表字典的 Pandas 数据框?效率

parsing - 寻找不是 LL(1) 的语言?

java - 使用 Java 在 HTML 页面中提取动态呈现的内容