我有一个字符串:
'class="a", class="b", class="ab", class="body", class="etc"'
我想删除除class="a"
和class="b"
以外的所有内容。
我该怎么做?我认为这个问题很容易,但是我被卡住了。
这是我的一些尝试,但它没有解决我的问题:
re.sub(r'class="also"|class="etc"', '', a)
我的字符串是一个很长的HTML代码,有很多类,我想只保留其中两个,并放弃所有其他的。有时候休息一下是件好事。我用漂白剂找到了解决方法
def filter_class(name, value):
if name == 'class' and value == 'aaa':
return True
attrs = {
'div': filter_class,
}
bleach.clean(html, tags=('div'), attributes=attrs, strip_comments=True)
您尝试显式枚举要删除的子字符串。与其编写这么长的模式,不如使用负查找,它提供了一种向一些更通用的模式添加排除的方法。
这里是一个正则表达式,你可以用一个干净的方式删除这些子字符串,而不考虑顺序:
,? ?bclass="(?![ab]")[^"]+"
参见regex demo
这里,对于(?![ab]")[^"]+
,我们匹配除"
([^"]+
)以外的1个或多个字符,但不匹配等于a
或b
((?![ab]")
)的字符。
import re
p = re.compile(r',? ?bclass="(?![ab]")[^"]+"')
test_str = "class="a", class="b", class="ab", class="body", class="etc"nclass="b", class="ab", class="body", class="etc", class="a"nclass="b", class="ab", class="body", class="a", class="etc""
result = re.sub(p, '', test_str)
print(result)
参见IDEONE demo
注意:如果您有较长的序列而不是a
和b
,请在预查中使用(?!(?:a|b)
非捕获组而不是字符类:
,? ?bclass="(?!(?:arbuz|baklazhan)")[^"]+"
查看另一个演示
另一个非常简单的解决方案…好运。
st = 'class="a", class="b", class="ab", class="body", class="etc"'
import re
res = re.findall(r'class="[a-b]"', st)
print res
'['class="a"', 'class="b"']'
你可以很容易地使用re。sub
res = re.sub(r'class="[a-zA-Z][a-zA-Z].*"', "", st)
print res
class="a", class="b"
如果您只想保留前两个条目,一种方法是使用split()
函数。这将在给定的分隔点将字符串拆分为list
。在你的例子中,这可以是一个逗号。然后可以用逗号将前两个列表元素连接在一起。
text = 'class="a", class="b", class="ab", class="body", class="etc"'
print ",".join(text.split(",")[:2])
会得到class="a", class="b"
如果条目可以在任何地方,并且对于想要的类的任意列表:
def keep(text, keep_list):
keep_set = set(re.findall("classw*=w*["'](.*?)["']", text)).intersection(set(keep_list))
output_list = ['class="%s"' % a_class for a_class in keep_set]
return ', '.join(output_list)
print keep('class="a", class="b", class="ab", class="body", class="etc"', ["a", "b"])
print keep('class="a", class="b", class="ab", class="body", class="etc"', ["body", "header"])
这将打印:
class="a", class="b"
class="body"