【问题标题】:Query a set with an regex使用正则表达式查询集合
【发布时间】:2015-06-21 20:26:32
【问题描述】:

我有一组字符串,我想询问它包含的所有元素,这些元素与特定的 RegEx 匹配。例如:

set = set(['abcd', 'abdd', 'acdd'])
set.findAll('ab.d')

这应该返回:

['abcd', 'abdd']

有办法吗?

【问题讨论】:

  • 给你的变量取一个不是set的名字。覆盖内置函数可能会产生奇怪的行为,并且会使您的代码更难阅读。

标签: python regex python-2.7 set


【解决方案1】:

遍历集合中的所有元素,并过滤正则表达式:

>>> s = {'abcd', 'abdd', 'acdd'}
>>> r = [el for el in s if re.search('ab.d', el)]
>>> r
['abcd', 'abdd']

【讨论】:

  • 为什么s 是没有值的字典?
  • @gabra 你可以看看sets and read more here
  • @BhargavRao 最好链接到Python 3 documentation
  • 应该事先编译正则表达式以使列表理解更高效:pattern = re.compile('ab.d'),然后在里面使用pattern.search
【解决方案2】:

您可以在列表理解中使用re.search

>>> s=set(['abcd', 'abdd', 'acdd'])
>>> [i for i in s if re.search(r'ab.d',i)]
['abcd', 'abdd']

【讨论】:

  • 我认为 OP 为正则表达式使用了一个玩具示例,实际情况更复杂。您的示例对于'cab' 也失败,它与ab. 不匹配,但确实被'ab' in i 捕获。
【解决方案3】:

这可以使用mapfilter 来完成

>>> s = {'abcd', 'abdd', 'acdd'}
>>> pat = re.compile('ab.d')
>>> map(lambda x:x.string,filter(None, map(pat.search,s)))
['abcd', 'abdd']

请注意,map 在微观上比列表理解要快。

bhargav@bhargav:~$ python -m timeit "import re;s = {'abcd', 'abdd', 'acdd'};[el for el in s if re.search('ab.d', el)]"
100000 loops, best of 3: 4.59 usec per loop
bhargav@bhargav:~$ python -m timeit "import re;s = {'abcd', 'abdd', 'acdd'};pat = re.compile('ab.d'); map(lambda x:x.string,filter(None, map(pat.search,s)))"
100000 loops, best of 3: 4.21 usec per loop

如您所见,使用mapfilter 使其速度更快0.38 微秒。

但是,如果您考虑可读性,orlp's list comprehension 会更好。 (在这种情况下,这是另一种方式)

【讨论】:

  • 更新了@GNU速度证明的答案
  • @BhargavRao 如果您编译正则表达式,列表理解实际上要快得多。
  • @tzaman 你去!我编译它的秘密原因。如果 orlp, 也这样做,我很乐意删除我的答案。泰
猜你喜欢
  • 2019-06-03
  • 2013-09-12
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
相关资源
最近更新 更多