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

Posted

技术标签:

【中文标题】使用正则表达式从python中的列表项中删除子字符串【英文标题】:Using regex to remove substrings from list items in python 【发布时间】:2014-06-25 15:50:36 【问题描述】:

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

['>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 循环中 print x,模式也不会被删除。我如何实际删除模式并更改列表?

谢谢你,如果这已经在某个地方得到回答,我们很抱歉!

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

完美运行,谢谢。出于兴趣,您选择模式 _\d+ 而不是 _[0-9]* 是否有原因? @PaulBarr \d 很容易写 :-) 除此之外,_[0-9]* 将替换 _,即使后面没有数字,因为 * 表示匹配 0或更多次。所以,如果字符串是_a,就会匹配_,匹配数字0次。 有道理!再次感谢

以上是关于使用正则表达式从python中的列表项中删除子字符串的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 正则表达式从字符串中删除/替换文本列表

使用正则表达式删除熊猫数据框中的子字符串

将正则表达式解析为 AST 的 Python 库?

从列表创建组合,如果子字符串到分隔符字符位于列表项的 1 个以上的子元素中,则从列表中删除

正则表达式从字符串中删除所有特殊字符?

用Python正则表达式从一个匹配项中打印出2个项目。