Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按值筛选列表_Python_Regex_List_Filter - Fatal编程技术网

Python 按值筛选列表

Python 按值筛选列表,python,regex,list,filter,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) 如何修复它 您可以使用re.sea

我有一张这样的清单

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)
如何修复它

您可以使用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:


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

正则表达式中缺少匹配的k。请尝试“^\d+k$”。

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

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


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

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

您可以单独使用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']
任何一个都会在第一时间“短路”,所以它是非常有效的

可以肯定的是,正则表达式没有错,但是如果您有一个更大的数据集,这可能会更快

re.search???^\d+$表示数字,仅表示从开始到结束的数字。[x表示ls中的x,如果re.findall'\d[a-zA-Z]',x]
>>> [el for el in ls if filter(str.isdigit, el)]
['5 k', '13 k']
>>> ls = ['5 k', 'k', '13 k', 'k']
>>> [s for s in ls if any(c.isdigit() for c in s)]
['5 k', '13 k']
>>> [el for el in ls if filter(str.isdigit, el)]
['5 k', '13 k']