删除Python中不匹配正则表达式的子字符串

时间:2015-07-17 13:54:03

标签: python regex

我有一个字符串:

{
  "code": 102,
  "error": "field recommendations cannot be included because it is not a pointer to another object"
}

我想删除除'class="a", class="b", class="ab", class="body", class="etc"' class="a"以外的所有内容。

我该怎么办?我认为这个问题很容易,但我被困住了。

以下是我的一些尝试,但它并没有解决我的问题:

class="b"

我的字符串是一个非常长的HTML代码,包含很多类,我想只保留其中两个,然后删除所有其他类。 有时候好好休息一下。我用漂白剂找到了解决方案

re.sub(r'class="also"|class="etc"', '', a)

3 个答案:

答案 0 :(得分:0)

如果您只想保留前两个条目,一种方法是使用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("class\w*=\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"

答案 1 :(得分:0)

您尝试显式枚举要删除的子字符串。您可以使用否定前瞻,而不是编写这么长的模式,这样可以为一些更通用的模式添加排除项。

这是一个正则表达式,您可以使用它以干净的方式删除这些子串并忽略顺序:

,? ?\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)")[^"]+"

请参阅another demo

答案 2 :(得分:0)

另一个非常简单的解决方案..祝你好运。

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"