【问题标题】:How to remove elements of a list containing specific patten with python?如何使用python删除包含特定模式的列表元素?
【发布时间】:2015-11-29 18:33:17
【问题描述】:

给定一个字符串列表

listA=['a', 'b', 'a@b=c', 'a @ b = c', 'a@ =b', 'a@=b' 'a=b@c', 'a@b' ]
                   ^         ^

我们希望删除标记为“^”的元素,并获取

ListB=['a', 'b', 'a@ =b', 'a@=b' 'a=b@c', 'a@b']

这里我们删除了所有包含“@”的元素,后跟一些字符,然后是“=”,但忽略了“@=”或“@ =”

如何为 python 列表做这样的正则表达式匹配?

编辑:

我知道如果我们知道要删除的元素的具体索引,我们可以使用 numpy.delete(list, index) 来删除它。但在这种情况下并非如此。

【问题讨论】:

  • 您可以发布您尝试过的内容吗?

标签: python arrays regex list


【解决方案1】:

python 中的正则表达式搜索可以通过 re 模块完成;具体来说,如果my_string 包含由\w 的成员分隔的@=,则re.search('@\w=', my_string) 将不是None,即单词字符(字母数字和_)。

我使用\s 对此进行了扩展,以包括也有空格的情况。

import re

listA = ['a', 'b', 'a@b=c', 'a @ b = c', 'a@ =b', 'a@=b' 'a=b@c', 'a@b' ]
listB = [a for a in listA if not re.search('@\s*\w+\s*=', a)]

更新: 上面的解决方案现在使用 \w+ 来匹配多个单词字符,而不仅仅是一个。

【讨论】:

  • 赞成更简洁并避免使用is None,就像我的回答一样(d'oh!)。
【解决方案2】:

使用表达式@\s*\S\s*=re.search() 我们可以过滤这个列表:

import re
listB = [str for str in listA if re.search(r'@\s*\S\s*=', str) is None]

print listB
# ['a', 'b', 'a@ =b', 'a@=ba=b@c', 'a@b']

【讨论】:

    【解决方案3】:
    import re
    listA = ['a', 'b', 'a@b=c', 'a @ b = c', 'a@ =b', 'a@=b' 'a=b@c', 'a@b' ]
    print [x for x in listA if not re.search(r'@\s*[a-zA-Z]\s*=', x)]
    

    【讨论】:

    • 考虑扩大你的答案,向提问者解释为什么这会达到预期的结果,可能链接到文档。事实上,这只是微不足道的用处。
    猜你喜欢
    • 2021-07-20
    • 2014-10-29
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多