如何从字符串列表中删除所有包含“ hs”之前的数字的字符串,例如“ 18hs”?

时间:2019-02-19 21:45:28

标签: python regex string substring

我有一个字符串列表,例如:

["hello","18hs","18aaa","21hr"]

如何删除所有与任何数字加"hs""h""hr"匹配的字符串?

注意:我不想丢失任何以“ h”结尾的字符串,例如“ fish”。

所需的输出:["hello,"18aaa"]

我知道可以通过正则表达式来完成,但是我无法正确设置捕获组。

3 个答案:

答案 0 :(得分:3)

HttpContext

这会遍历列表,并保留与正则表达式>>> import re >>> words = ["hello", "18hs", "18aaa", "21hr"] >>> [w for w in words if not re.match(r'\d+h', w)] ['hello', '18aaa'] 不匹配的项目,这意味着“一个或多个数字后跟一个h”。

如果您需要保留\d+h之类的字符串,请使用更具体的正则表达式7hg,表示“一个或多个数字,h,可选s或r,字符串结尾”:

\d+h(s|r)?$

还要注意,>>> words = ["hello", "18hs", "18aaa", "21hr", '7hg'] >>> [w for w in words if not re.match(r'\d+h(s|r)?$', w)] ['hello', '18aaa', '7hg'] 自动匹配字符串的开头,因此就像正则表达式开头的隐式re.match一样。

答案 1 :(得分:0)

  • 环游他们
  • 检查此正则表达式是否存在任何匹配项:(\d+h)
  • 如果是,请删除元素
  • 否则

非常简单的东西。

答案 2 :(得分:0)

如果您像这样使用列表过滤器和lambda,应该会很简单:

my_list = ["hello","18hs","18aaa","21hr"] # input data

custom_filters = [lambda x: not x.endswith('hr'),  
                  lambda x: not x.endswith('hs'), 
                  lambda x: not x.endswith('h')] # define custom filters

final = list(filter(lambda x: all([custom_filter(x) for custom_filter in custom_filters]), my_list)) # apply custom filters one by one

# should result in ["hello", "18aaa"]