2017-07-06 91 views
1

我有可能包含字母,符號,數字等字符串列表,如下圖所示:提取8位數字

list = ['\n', '', '0', '38059', '', '', '?_', '71229366', '', '1', '38059', '', '', '?_', '87640804', '', '2', '38059', '', '', '?_', '71758011', '', '', ':?', ';__', '71229366287640804271758011287169822'] 

如何過濾掉所有其他字符串,除了小於10000000且大於99999999的數字?

預期輸出:

list = ['71229366', '87640804', '71758011'] 
+1

什麼意思與*所有字符*? – RomanPerekhrest

+4

這裏是沒有字符的輸出'''' –

+0

嘗試'list = None' – Jon

回答

3

如果你不介意做一個新的列表,你可以嘗試的東西只是一個列表理解像

filtered_list = [i for i in list if i.isdigit() and 10000000 < int(i) < 99999999] 
3

您可以使用mapfilter

your_list = ['\n', '', '0', '38059', '', '', '?_', '71229366', '', '1', '38059', 
      '', '', '?_', '87640804', '', '2', '38059', '', '', '?_', '71758011', 
      '', '', ':?', ';__', '71229366287640804271758011287169822'] 

new_list = list(map(int, filter(lambda x: x.isdigit() and 10000000 < int(x) < 99999999, your_list))) 
print(new_list) 

list() python2上的可選項。

輸出:

[71229366, 87640804, 71758011] 

如果你不想整數轉換,刪除map

>>> list(filter(lambda x: x.isdigit() and 10000000 < int(x) < 99999999, your_list)) 
['71229366', '87640804', '71758011'] 
1
def valid(v): 
    try: 
     value = int(v) 
     return 10000000 <= value <= 99999999 
    except: 
     return False 

output = [x for x in list if valid(x)] 

說明

使用有效函數作爲標準過濾列表中的所有值。

1
data = ['\n', '', '0', '38059', '', '', '?_', '71229366', '', '1', '38059', 
     '', '', '?_', '87640804', '', '2', '38059', '', '', '?_', '71758011', 
     '', '', ':?', ';__', '71229366287640804271758011287169822'] 

res = [] 
for e in data: 
    try: 
     number = int(e) 
    except ValueError: 
     continue 
    if 10000000 < number < 99999999: 
     res.append(str(number)) 

打印(RES)

print(res) 

輸出:

['71229366', '87640804', '71758011'] 
0

讓我提供一個簡單而有效的回答,使用正則表達式。沒有必要map(複製原始列表),或將所有內容都轉換爲int s;你基本上是問如何保持所有8位整數在您的列表:

>>> filter(re.compile('^\d{8}$').match, data) 
['71229366', '87640804', '71758011'] 

我們compile一個正則表達式,通過該標準提供的regex.match部分應用程序匹配正好8個數字,然後過濾列表filter功能。