我有一个此列表:
my_list = ['Judy 88 5', 'animal 91 5', 'Mo 86 5', 'Geno 87 6', 'exhaled 87 6']
我想从此列表中删除所有非数字项,即-
['88 5', '91 5', '86 5', '87 6', '87 6']
我只想要两位数字,即-
['88', '91', '86', '87', '87']
如何在不更改索引的情况下实现它? 我尝试使用
my_list = [elem for elem in my_list if not any(c.isalpha() for c in elem)]
但是它只是返回了一个空列表...
编辑: regex在此列表上帮助了我,但是如果列表是这样的话怎么办:
my_list = ['J55udy 88 5', 'anim31al 91 5', 'Mo2 86 5', 'Geno 87 6', 'exhaled 87 6']
我的列表在所有方面都在变化,但是它具有不变的风格,首先是用户名,然后是两位数,然后是一位数,问题是有时用户在他的名字中使用了位数,我怎么只能得到2即使列表看起来像这样,中间还是几位?
my_list = ['J558udy 88 5', 'anim31al 91 5', 'Mo52 86 5', 'Gen3o 87 6', 'exhaled 87 6']
答案 0 :(得分:1)
使用正则表达式。
例如:
import re
my_list = ['Judy 88 5', 'animal 91 5', 'Mo 86 5', 'Geno 87 6', 'exhaled 87 6']
res = []
for i in my_list:
m = re.search(r"\b(\d{2})\b", i)
if m:
res.append(m.group())
print(res)
输出:
['88', '91', '86', '87', '87']
\b
正则表达式边界。 \d{2}
查找2位整数。答案 1 :(得分:0)
您可以使用以下正则表达式:
import re
my_list = ['Judy 88 5', 'animal 91 5', 'Mo 86 5', 'Geno 87 6', 'exhaled 87 6']
regex = re.compile(r'\b\d\d\b')
my_list = [regex.search(i).group() for i in my_list]
my_list
将变为:
['88', '91', '86', '87', '87']
答案 2 :(得分:0)
Regex确实是一个很好的解决方案,但如果没有它也可以实现。以下解决方案将在字符串中找到所有两位数字,即使您有多个实例,例如:'blabla 88 5 63'
。
my_list = ['Judy 88 5', 'animal 91 5', 'Mo 86 5', 'Geno 87 6', 'exhaled 87 6']
digits = "123456789"
new_list = []
for elt in my_list:
for k, l in enumerate(elt):
if l in digits and k!= len(elt)-1 and elt[k+1] in digits:
new_str = elt[k:k+2]
new_list.append(new_str)
它可以变成一个衬里:
digits = "123456789"
[elt[k:k+2] for elt in my_list for k, l in enumerate(elt) if l in digits and k!= len(elt)-1 and elt[k+1] in digits]
Out[37]: ['88', '91', '86', '87', '87']
答案 3 :(得分:0)
您可能可以使用正则表达式提取数字字符串。
import re
my_list = ['Judy 88 5', 'animal 91 5', 'Mo 86 5', 'Geno 87 6', 'exhaled 87 6']
nums = [re.search('\d+', lst).group(0) for lst in my_list]
print(nums)
输出
['88', '91', '86', '87', '87']
[Finished in 0.1s]