2011-03-24 70 views
0

我想使用python re模塊按數字數字過濾int數字。如何使用python re模塊按數字過濾int數字

1 
    700 
76093 
71365 
35837 
75671 
^^     
||--------------------- this position should not be 6,7,8,9,0 
|---------------------- this position should not be 5,6,7 

代碼:

int_list=[1,700,76093,71365,35837,75671] 
str_list = [str(x).zfill(5) for x in int_list] 
reexp = r"\d[0-4,8-9][1-5]\d\d" 
import re 
p = re.compile(reexp) 
result = [int("".join(str(y) for y in x)) for x in str_list if p.match(x)] 

我有2個問題:

1.Is可以生成從下面的代碼串reexp:

thousand_position = set([1,2,3,4,5,1,1,1,1,1,1,1,1,1,1]) 
hundred_position = set([1,2,3,4,8,9,0,1,2,3,2,3,1,2]) 

2.how到使reexp更簡單,避免低於0的前綴錯誤?

00700 
00500   <--- this will also drops into the reexp, it is a 
        bug because it has no kilo number 
10700 

reexp = r"\d[0-4,8-9][1-5]\d\d" 

感謝您的時間

B.Rgs

PS:感謝suggstion下面的數學解決方案,我知道這可能是容易和更快,但我想基於RE版到平衡其他想法。

+0

just fyi,see my edited answer。讓我知道它是否有任何問題。 – senderle 2011-03-25 00:12:47

回答

1

好吧,首先,我要發佈一些代碼,實際上做你的描述開始:

>>> int_list=[1, 700, 76093, 71365, 35837, 75671] 
>>> str_list = [str(i).zfill(5) for i in int_list] 
>>> filtered = [s for s in str_list if re.match('\d[0-4,8-9][1-5]\d\d', s)] 
>>> filtered 
['71365'] 

編輯:好吧,我想我現在明白你的問題。您可以使用rjust,而不是使用zfill,它將插入空格而不是零。

>>> int_list=[1,700,76093,71365,35837,75671,500] 
>>> str_list = [str(i).rjust(5) for i in int_list] 
>>> re_str = '\d' + str(list(set([0, 1, 3, 4, 8, 9]))) + str(list(set([1, 2, 3, 4, 5]))) + '\d\d' 
>>> filtered = [s for s in str_list if re.match(re_str, s)] 
>>> filtered 
['71365'] 

我認爲這樣做數學,因爲顏建議最後會更快,但也許你有你的理由使用正則表達式。

+0

感謝您的回答,第二個問題在這裏工作,因爲00700沒有在正則表達式'\ d [0-4,8-​​9] [1-5] \ d \ d'中下降,但00500怎麼樣? – user478514 2011-03-24 05:15:26

+0

@ user478514:我修改了第二個版本來做我認爲你想要的東西。 – senderle 2011-03-24 13:29:03

4

您確定要使用re模塊嗎?你可以通過一些簡單的數學操作來了解你想要做什麼。

def valid_number(n): 
    return 0 < n%1000/100 < 6 and not 5 >= n%10000/1000 >= 7 

int_list = [1,700,76093,71365,35837,75671,] 
result = [x for x in int_list if valid_number(x)] 

或者:

result = filter(valid_number, int_list) 
+0

感謝您的快速純數學解決方案,但我想用重新使這些非數學家的問題更簡單,通過使用重新和數字我可以添加用戶界面0-9複選框後,也許.. 。我可以知道這裏n%是什麼意思嗎? – user478514 2011-03-24 04:41:33

相關問題