正则表达式匹配非字母数字字符

时间:2013-12-10 16:39:07

标签: python regex

我正在使用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', '(:', '(', '))']

这是我对这个问题的正则表达式的第一次尝试,但它并没有真正达到预期的效果。如何编写正则表达式来忽略任何带有非字母数字字符的字符串?

3 个答案:

答案 0 :(得分:5)

BTW你的正则表达式似乎与非字母数字字符匹配。但是,从当前正在迭代的列表中删除项目并不是建议,这就是导致此错误的原因因此要克服此错误,请创建一个新列表并附加到其中不匹配的元素。

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

据我测试,这几乎适用于所有场景。

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