在Python中,如何从列表中删除包含某些字符的任何元素?

时间:2011-08-10 16:52:29

标签: python regex list elements

道歉,如果这是一个简单的问题,我对此仍然很陌生,但我花了一段时间寻找答案,但没有找到任何答案。我有一个看起来像这个可怕的混乱的列表:

['Organization name} ', '> (777) 777-7777} ', ' class="lsn-mB6 adr">1 Address, MA 02114 } ', ' class="lsn-serpListRadius lsn-fr">.2 Miles} MORE INFO YOUR LISTING MAP if (typeof(serps) !== \'undefined\') serps.arrArticleIds.push(\'4603114\'); ', 'Other organization} ', '> (555) 555-5555} ', ' class="lsn-mB6 adr">301 Address, MA 02121 } ', ' class="lsn-serpListRadius lsn-fr">.2 Miles} MORE INFO CLAIM YOUR LISTING MAP if (typeof(serps) !== \'undefined\') serps.arrArticleIds.push(\'4715945\'); ', 'Organization} ']

我需要对其进行处理,以便HTML.py可以将其中的信息转换为表格。由于某种原因,HTML.py根本无法处理怪物元素(例如'class =“lsn-serpListRadius lsn-fr”> .2 Miles}更多信息您的上市地图if(typeof(serps)!== \ 'undefined \')serps.arrArticleIds.push(\''4603114 \');'等)。对我来说幸运的是,我实际上并不关心怪物元素中的信息并想要摆脱它们。

我尝试编写一个匹配所有超过两个字母的全大写单词的正则表达式来识别怪物元素,并得到了这个:

re.compile('[^a-z]*[A-Z][^a-z]*\w{3,}')

但我不知道如何应用它来从列表中删除包含与该正则表达式匹配的元素。我该怎么做/这是正确的方法吗?

5 个答案:

答案 0 :(得分:27)

我认为您的正则表达式不正确,要匹配包含三个或更多字符的全部字词的所有条目,您应该使用re.search这样的内容:

regex = re.compile(r'\b[A-Z]{3,}\b')

使用它可以使用列表推导或filter内置函数进行过滤:

full = ['Organization name} ', '> (777) 777-7777} ', ' class="lsn-mB6 adr">1 Address, MA 02114 } ', ' class="lsn-serpListRadius lsn-fr">.2 Miles} MORE INFO YOUR LISTING MAP if (typeof(serps) !== \'undefined\') serps.arrArticleIds.push(\'4603114\'); ', 'Other organization} ', '> (555) 555-5555} ', ' class="lsn-mB6 adr">301 Address, MA 02121 } ', ' class="lsn-serpListRadius lsn-fr">.2 Miles} MORE INFO CLAIM YOUR LISTING MAP if (typeof(serps) !== \'undefined\') serps.arrArticleIds.push(\'4715945\'); ', 'Organization} ']
regex = re.compile(r'\b[A-Z]{3,}\b')
# use only one of the following lines, whichever you prefer
filtered = filter(lambda i: not regex.search(i), full)
filtered = [i for i in full if not regex.search(i)]

以下列表中的结果(我认为您正在寻找:

>>> pprint.pprint(filtered)
['Organization name} ',
 '> (777) 777-7777} ',
 ' class="lsn-mB6 adr">1 Address, MA 02114 } ',
 'Other organization} ',
 '> (555) 555-5555} ',
 ' class="lsn-mB6 adr">301 Address, MA 02121 } ',
 'Organization} ']

答案 1 :(得分:5)

首先,存储正则表达式,然后使用列表解析:

regex = re.compile('[^a-z]*[A-Z][^a-z]*\w{3,}')
okay_items = [x for x in all_items if not regex.match(x)]

答案 2 :(得分:2)

或者完全相同但没有编译正则表达式:

from re import match

ll = ['Organization name} ', '> (777) 777-7777} ', ' class="lsn-mB6 adr">1 Address, MA 02114 } ', ' class="lsn-serpListRadius lsn-fr">.2 Miles} MORE INFO YOUR LISTING MAP if (typeof(serps) !== \'undefined\') serps.arrArticleIds.push(\'4603114\'); ', 'Other organization} ', '> (555) 555-5555} ', ' class="lsn-mB6 adr">301 Address, MA 02121 } ', ' class="lsn-serpListRadius lsn-fr">.2 Miles} MORE INFO CLAIM YOUR LISTING MAP if (typeof(serps) !== \'undefined\') serps.arrArticleIds.push(\'4715945\'); ', 'Organization} ']

filteredData = [x for x in ll if not match(r'[^a-z]*[A-Z][^a-z]*\w{3,}', x)]

编辑:

from re import compile

rex = compile('[^a-z]*[A-Z][^a-z]*\w{3,}')
filteredData = [x for x in ll if not rex.match(x)]

答案 3 :(得分:1)

没有正则表达式

def isNotMonster(x):
    return not any((len(word) > 2) and (word == word.upper()) for word in x.split())

okay_items = filter(isNotMonster, all_items)

答案 4 :(得分:0)

element = 'string_to_search'
for item in y_list_of_items:
    if element in item:
        y_list_of_items.remove(item)