2013-12-10 231 views
2

我正在使用Python解析列表中的某些字符串。某些字符串可能只包含我想它忽略,像這樣的非字母數字字符:與非字母數字字符匹配的正則表達式

list = ['()', 'desk', 'apple', ':desk', '(house', ')', '(:', ')(', '(', ':(', '))'] 

for item in list: 
    if re.search(r'\W+', item): 
     list.remove(item) 

# Ideal output 
list = ['desk', 'apple', ':desk', '(house'] 

# Actual output 
list = ['desk', 'apple', '(:', '(', '))'] 

這是我的正則表達式對於這個問題的第一次嘗試,但它不是真的有預期的效果。我如何編寫一個正則表達式來忽略任何帶有非字母數字字符的字符串?

+2

什麼你期望的結果?這似乎是正確的,因爲具有非字母數字字符的兩個字符串已被刪除。 – Evert

+0

嗯,我可能有誤讀,但我把你的問題是,你只想排除只是非字母數字的字符串,即你想在列表中留下一個字符串,如'(蘋果)'。那是對的嗎? – Sean

+0

我已更新我的示例以顯示我所得到的結果,而不是我想要的結果。 – solr

回答

4

順便說一句,你的正則表達式似乎匹配非字母數字字符。然而,它不是建議從當前迭代的列表中刪除項目,並且這是此錯誤的原因因此克服此創建一個新的列表並追加到它不匹配的元素。

enter image description here

演示:

import re 

list = ['()', 'desk', 'apple', ':desk', '(house', ')', '(:', ')(', '(', ':(', '))'] 
new_list = [] 

for item in list: 
    if not re.search(r'^\W+$', item) or re.search(r'^\w+', item) : 
     new_list.append(item) 

print new_list 

產地:

['desk', 'apple', ':desk', '(house'] 

據我測試的這部作品在幾乎所有的場景。

+0

\ W == [^ \ w]顧名思義 – njzk2

+0

那就是我說的@ njzk2 –

0

問題不在於你的正則表達式。您正在迭代您正在修改的列表,這會導致奇怪(請參閱Modifying list while iterating)。您可以使用列表理解像喬恩張貼,或者你可以遍歷列表的副本:for item in list[:]:

+0

這個問題也與正則表達式有關。根據OP編輯的問題,他們需要一個正則表達式,它將匹配僅包含非字母數字字符的字符串。 –

2

什麼列表理解與re.match(pattern, string)

import re 

items = ['()', 'desk', 'apple', ')', '(:', ')(', '(', ':(', '))'] 
cleaned_items = [item for item in items if re.match('\W?\w+', item)] 
print cleaned_items 

這將打印

['desk', 'apple', ':desk', '(house'] 
相關問題