【问题标题】:How to remove a string with varying numbers at the end如何删除末尾具有不同数字的字符串
【发布时间】:2013-07-02 20:13:22
【问题描述】:

我正在尝试删除以 SRR 开头并以“长度 = 不同长度的不同数字”结尾的字符串。我只知道这个数字在 1 到 200 之间变化...

我不知道怎么做,也不知道哪种方法最有效。我正在处理大文件 (>10GB)。

我想对从 1 到 200 的所有值进行循环测试:

import os
import re
f2 = open(r'path')
num = 0
while num < 200:
    num = num+1
    ident2 = re.compile('SRR.*?%d' %num, re.DOTALL)
    stuff = f2.read()
    for line in f2:
        ident2.sub('',stuff)

代码总体上要长得多,但是我确实在最后编写并关闭了东西。我只是想知道我是否可以使用一个将每个数字都考虑在内并删除字符串的表达式...

我们将不胜感激任何建议和建设性批评。

我正在添加文本输入的示例:

@SRR566546.970 HWUSI-EAS1673_11067_FC7070M:4:1:2299:1109 length=50TTGCCTGCCTATCATTTTAGTGCCTGTGAGGTGGAGATGTGAGGATCAGT+SRR566546.970 HWUSI-EAS1673_11067_FC7070M:4:1:2299:1109 length=50hhhhhhhhhhghhghhhhhfhhhhhfffffe`ee[`X]b[d[ed`[Y[^Y

都是一行,我有很多相似序列的重复。

【问题讨论】:

    标签: python regex python-3.x


    【解决方案1】:

    只匹配数字:

    re.compile('SRR.*?\d{1,3}', re.DOTALL)
    

    \d 匹配字符 0-9,{1,3} 匹配其中 1 到 3 个字符。

    如果您不想匹配以SRR 开头然后后跟大于 200 的数字的任何内容,您可以创建一个更挑剔的表达式:

    re.compile('SRR.*?(?:[1-9]|[1-9]\d|1\d{2}|200)', re.DOTALL)
    

    匹配 1 到 9 之间的一位数字, 10 到 99 之间的 2 位数字, 100 到 199 之间的 3 位数字,数字200。

    这些表达式都不会阻止匹配后跟更多数字。您可能需要将\b 边界锚添加到表达式的末尾:

    re.compile('SRR.*?\d{1,3}\b', re.DOTALL)
    

    对于您发布的示例,我会明确包含 length= 参数:

    re.compile('SRR.*?length=(?:[1-9]|[1-9]\d|1\d{2}|200)', re.DOTALL)
    

    【讨论】:

    • 哇,谢谢,我不知道你可以这样使用 \d。
    • re.compile('^SRR.*?[012]{1,2}\d\b$', re.DOTALL)
    • @blackwind: 允许使用000 模式,这根本不是一个数字。它不允许199,它应该匹配。
    • re.compile('^SRR.*?[12]{0,2}[1-9]\b$', re.DOTALL) @martin 谢谢
    • @Fabien:将文件作为迭代器逐行处理是处理大文件的最佳方法。如果一个正则表达式比其他选项更好,取决于你到底想做什么;将方法与timeit 模块进行比较。
    猜你喜欢
    • 2015-02-02
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    相关资源
    最近更新 更多