我有一个字符串列表,例如:
["hello","18hs","18aaa","21hr"]
如何删除所有与任何数字加"hs"
或"h"
或"hr"
匹配的字符串?
注意:我不想丢失任何以“ h”结尾的字符串,例如“ fish”。
所需的输出:["hello,"18aaa"]
我知道可以通过正则表达式来完成,但是我无法正确设置捕获组。
答案 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"]