我正在使用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', '(:', '(', '))']
这是我对这个问题的正则表达式的第一次尝试,但它并没有真正达到预期的效果。如何编写正则表达式来忽略任何带有非字母数字字符的字符串?
答案 0 :(得分:5)
BTW你的正则表达式似乎与非字母数字字符匹配。但是,从当前正在迭代的列表中删除项目并不是建议,这就是导致此错误的原因因此要克服此错误,请创建一个新列表并附加到其中不匹配的元素。
演示:
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']
据我测试,这几乎适用于所有场景。
答案 1 :(得分: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']
答案 2 :(得分:0)
问题不在于你的正则表达式。您正在迭代您正在修改的列表,这会导致奇怪(请参阅Modifying list while iterating)。您可以使用Jon发布的列表推导,也可以迭代列表的副本:for item in list[:]: