我有一个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
答案 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']