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

Posted

技术标签:

【中文标题】在 Python 中,如何从列表中删除包含某些类型字符的任何元素?【英文标题】:In Python, how do I remove from a list any element containing certain kinds of characters? 【发布时间】:2011-10-24 06:54:05 【问题描述】:

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

['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]*\w3,')

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

【问题讨论】:

【参考方案1】:

我认为您的正则表达式不正确,要匹配包含三个或更多字符的全大写单词的所有条目,您应该使用类似 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 ']

【讨论】:

两条线的速度有区别吗?【参考方案2】:

首先,存储您的正则表达式,然后使用列表推导:

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

【讨论】:

这似乎应该可以工作,但由于某种原因,它在使用我的原始正则表达式时返回一个没有组织名称的列表,而当使用 FJ 时,它只会吐出我输入的相同列表。不是确定为什么。【参考方案3】:

或者相同但不编译正则表达式:

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]*\w3,', x)]

已编辑:

from re import compile

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

【讨论】:

如果您要对列表中的许多项目运行相同的正则表达式,您应该编译它。当然,Python 通常足够聪明,可以为您编译并缓存它,但最好是显式的。【参考方案4】:

没有正则表达式

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

okay_items = filter(isNotMonster, all_items)

【讨论】:

这仅返回组织的名称——这实际上对我现在也有帮助,所以单独感谢,但这不是我想要的。【参考方案5】:
element = 'string_to_search'
for item in y_list_of_items:
    if element in item:
        y_list_of_items.remove(item)

【讨论】:

以上是关于在 Python 中,如何从列表中删除包含某些类型字符的任何元素?的主要内容,如果未能解决你的问题,请参考以下文章

从列表中删除 NoneType 元素的本机 Python 函数?

Python Pandas:如何从包含列表中值的数据框中删除所有列?

如何从python中的混合数据类型列表中删除nan(float)项目[重复]

从 Python 字符串中删除不在允许列表中的 HTML 标记

在 Python 中从序列中删除项目的优雅方法? [复制]

即使项目不连续使用Python,如何从长嵌套列表中删除短列表?