删除Python中不匹配regex的子字符串



我有一个字符串:

'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个或多个字符,但不匹配等于ab ((?![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

注意:如果您有较长的序列而不是ab,请在预查中使用(?!(?: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"

最新更新