我有一个像这样的列表
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)
如何解决?
答案 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]