按值过滤列表

时间:2017-08-02 15:02:31

标签: python regex list filter

我有一个像这样的列表

ls = ['5 k', 'k', '13 k', 'k']

我想获得一个包含数字

的值列表
ls = ['5 k', '13 k']

我这样做如下

import re
y = [x for x in ls if x == re.compile('^\d+$')]
y

并获取

[]

此版本的内容相同

r = re.compile('^[0-9]+$')
for e in filter(r.match, ls):
    print(e)

如何解决?

6 个答案:

答案 0 :(得分:5)

您可以使用re.search,如果您只想测试字符串是否包含数字,也不需要锚点。 ^[0-9]+$将匹配仅包含数字的字符串:

import re
ls = ['5 k', 'k', '13 k', 'k']
​
[x for x in ls if re.search(r'\d', x)]
# ['5 k', '13 k']

如果您想测试字符串是否以数字开头,请使用re.match

[x for x in ls if re.match(r'\d', x)]
​
# ['5 k', '13 k']

如果找到匹配,这两个函数都返回一个对象(trusy),否则返回None(falsy),因此它们可以与if一起用作布尔条件来过滤元素。

答案 1 :(得分:1)

您可以仅使用Python过滤此列表:

>>> ls = ['5 k', 'k', '13 k', 'k']
>>> [s for s in ls if any(c.isdigit() for c in s)]
['5 k', '13 k']

any将在第一个True上“短路”,因此非常有效。

正则表达式没有任何问题,但如果您拥有更大的数据集,这可能会更快。

答案 2 :(得分:1)

#{user_email}

答案 3 :(得分:0)

您在正则表达式中缺少匹配'^\d+ k$'。试试class TrabGraph: def circle(self): print (self.radius) def __init__(self,radius): self.radius = radius TrabGraph(2).circle()

答案 4 :(得分:0)

你的正则表达式与你想要的不匹配,但只是一个数字序列的字符串。

您最好尝试使用'^\d+ k$'

import re
y = [x for x in ls if x == re.compile('^\d+ k$')]
y

答案 5 :(得分:0)

正则表达式解决方案还有其他答案,但值得指出的是,您不一定需要使用正则表达式来过滤这些解决方案。例如,根据当前内容,您可以过滤掉任何缺少空格的内容(到目前为止我看到的正则表达式解决方案都需要空间在那里)。

[x for x in ls if ' ' in x]