正则表达式匹配键除了一个

时间:2016-03-17 16:37:05

标签: python regex

我有一个python列表。它包含items[number].some field之类的字符串。除了匹配items[<number>].classification的字符串之外,我希望得到所有这些字符串。我怎么能用正则表达式做到这一点,或者还有另一种方法呢?

作为一个例子,我有类似的东西:

  

data.items。[0] .deliveryAddress.region

     

data.items。[0] .classification.scheme

     

data.items。[0] .classification.id

     

data.items。[0] .DESCRIPTION

我想只留下来:

  

data.items。[0] .DESCRIPTION

     

data.items。[0] .deliveryAddress.region

2 个答案:

答案 0 :(得分:2)

为此,我使用此正则表达式匹配您要丢弃的字符串:

data.items.\[\d+\].classification

假设我有一个包含名为l的项目的Python列表:

l = ["data.items.[0].deliveryAddress.region",
"data.items.[0].classification.scheme",
"data.items.[0].classification.id",
"data.items.[0].description"]

然后我可以使用列表推导来保留与正则表达式不匹配的值,方法是使用re.match

>>> import re
>>> [x for x in l if not re.match(r"data.items.\[\d+\].classification", x)]
['data.items.[0].deliveryAddress.region', 'data.items.[0].description']

答案 1 :(得分:1)

你可以选择与锚点相结合的负向前瞻:

^((?:.(?!classification))+)$

在Python代码中,这将是:

import re

string = """
data.items.[0].deliveryAddress.region
data.items.[0].classification.scheme
data.items.[0].classification.id
data.items.[0].description
"""

rx = re.compile(r'^((?:.(?!classification))+)$', re.MULTILINE)

matches = rx.findall(string)
print matches
# ['data.items.[0].deliveryAddress.region', 'data.items.[0].description']

显然,这也适用于列表:

import re

lst = ['data.items.[0].deliveryAddress.region',
'data.items.[0].classification.scheme',
'data.items.[0].classification.id',
'data.items.[0].description']

# no need for re.MULTILINE here
rx = re.compile(r'^((?:.(?!classification))+)$') 

matches = [x for x in lst if rx.match(x)]
print matches
# ['data.items.[0].deliveryAddress.region', 'data.items.[0].description']

请参阅a demo on regex101.com