python-从列表内的字符串中删除所有非数字字符

时间:2018-09-24 11:26:10

标签: python list list-comprehension

我有一个此列表:

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']

4 个答案:

答案 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]