使用正则表达式从Python列表项中删除子字符串

3

我相信这一定是一个重复的问题,但我无法在任何地方找到答案。我有一个包含多个字符串的列表,如下所示:

['>ctg7180000016561_3757\nAAAAATTTAGTTAAAACTATAACATTAGCTTGTCAAGCTAAAATTACTATGTAAGTAGTAATTTTTA\n', '>ctg7180000016561_3824\nATCCCTCAAATAGCACCCATTAACTGATTATCCTTATTCTTAATATTCACCACCTCTCTCCTAATATTTAGAGCTTCTAACTATTTCTTTATCATGTACCCCCCCAAAAAATCTGTTTTTTATAAAAAAACTAGTATAAATAACTGATCATGATAACTAACCTCTTTTCGTCTTTCGACCCCTCTACTAACTTAAATACTAACTTTAACTGAGTTAGGACTATCCTCGGGGTGGCTGTAATCCCGAGGATATTTTGGATTATCCCCTCGCGTTTCTCCCTGCTTTGAATAAAACTTATCAGTACTCTTCACAAAGAATTCAAAGTCCTTGTTAACAACAAAAAATCCCAAGGCAGAACCCTAATCCTGATTTCCTTATTTTCTATTATTTTATTTAATAACTTCATAGGACTATTCCCATATATTTTCACATCCACAAGTCACATAGTATTAACCCTGTCCCTGGCTCTCCCCATATGACTAAGATTTATATTGTATGGGTGGGTAAATAATACAACCCACATGCTAGCCCATCTAGTACCCCAAGGAACCCCTGCCGTTCTAATACCATTTATGGTGTGTATTGAAACAATCAGAAATGTTATCCGACCCGGCACCCTGGCAATCCGGCTATCCGCAAATATAATTGCAGGACACCTACTAATAACCCTTCTAGGTAACACGGGAAAC\n', '>ctg7180000016561_4513\nT\n']

我想要做的就是去除下划线后面的数字,所以在这个例子中输出的结果应该是:

['>ctg7180000016561\nAAAAATTTAGTTAAAACTATAACATTAGCTTGTCAAGCTAAAATTACTATGTAAGTAGTAATTTTTA\n', '>ctg7180000016561\nATCCCTCAAATAGCACCCATTAACTGATTATCCTTATTCTTAATATTCACCACCTCTCTCCTAATATTTAGAGCTTCTAACTATTTCTTTATCATGTACCCCCCCAAAAAATCTGTTTTTTATAAAAAAACTAGTATAAATAACTGATCATGATAACTAACCTCTTTTCGTCTTTCGACCCCTCTACTAACTTAAATACTAACTTTAACTGAGTTAGGACTATCCTCGGGGTGGCTGTAATCCCGAGGATATTTTGGATTATCCCCTCGCGTTTCTCCCTGCTTTGAATAAAACTTATCAGTACTCTTCACAAAGAATTCAAAGTCCTTGTTAACAACAAAAAATCCCAAGGCAGAACCCTAATCCTGATTTCCTTATTTTCTATTATTTTATTTAATAACTTCATAGGACTATTCCCATATATTTTCACATCCACAAGTCACATAGTATTAACCCTGTCCCTGGCTCTCCCCATATGACTAAGATTTATATTGTATGGGTGGGTAAATAATACAACCCACATGCTAGCCCATCTAGTACCCCAAGGAACCCCTGCCGTTCTAATACCATTTATGGTGTGTATTGAAACAATCAGAAATGTTATCCGACCCGGCACCCTGGCAATCCGGCTATCCGCAAATATAATTGCAGGACACCTACTAATAACCCTTCTAGGTAACACGGGAAAC\n', '>ctg7180000016561\nT\n']

我正在使用正则表达式,已经找到了完美匹配,但是我不知道如何删除子字符串。 我目前的代码如下:

pattern = re.compile('_[0-9]*')
for x in SequenceList:
    re.sub(pattern, '', x)

我知道这只是改变变量x,但即使我在for循环里只打印x,这个模式也不会被移除。我该如何真正删除模式并修改列表呢?
谢谢,如果这已经在其他地方回答过了,我很抱歉!
1个回答

6

字符串是不可变的。因此,re.sub将创建一个新的字符串。相反,您可以使用列表推导式来创建一个包含替换后字符串的新列表,如下所示:

import re
pattern = re.compile(r"_\d+")
print [pattern.sub("", item) for item in data]

非常完美,谢谢。顺便问一下,您选择使用模式 _\d+ 而不是 _[0-9]* 有什么原因吗? - PaulBarr
1
@PaulBarr \d 很容易编写 :-) 除此之外,_[0-9]* 将会替换掉 _ 即使它后面没有任何数字,因为 * 表示匹配 0 或多次。所以,如果字符串是 _a,它将匹配 _ 并将数字匹配 0 次。 - thefourtheye
有道理!再次感谢。 - PaulBarr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接