【问题标题】:Filter list by value按值过滤列表
【发布时间】:2017-08-02 15:02:30
【问题描述】:

我有一个这样的列表

ls = ['5 k', 'k', '13 k', 'k']

我想得到一个包含数字的列表

ls = ['5 k', '13 k']

我是这样做的

import re
y = [x for x in ls if x == re.compile('^\d+$')]
y

得到

[]

这个版本也是这样

r = re.compile('^[0-9]+$')
for e in filter(r.match, ls):
    print(e)

如何解决?

【问题讨论】:

  • re.search()??
  • ^\d+$ 表示数字,只有数字从头到尾
  • [x for x in ls if re.findall('\d [a-zA-Z]', x)]

标签: python regex list filter


【解决方案1】:

您可以使用re.search,如果您只想测试字符串是否包含数字,也不需要锚点。 ^[0-9]+$ 将匹配仅包含数字的字符串:

import re
ls = ['5 k', 'k', '13 k', 'k']
​
[x for x in ls if re.search(r'\d', x)]
# ['5 k', '13 k']

如果要测试字符串是否以数字开头,请使用re.match

[x for x in ls if re.match(r'\d', x)]
​
# ['5 k', '13 k']

如果找到匹配,这两个函数都返回一个对象(trusy),否则返回 None(falsy),因此它们可以与if 一起用作过滤元素的布尔条件。

【讨论】:

    【解决方案2】:
    >>> [el for el in ls if filter(str.isdigit, el)]
    ['5 k', '13 k']
    

    【讨论】:

      【解决方案3】:

      您可以单独使用 Python 过滤此列表:

      >>> ls = ['5 k', 'k', '13 k', 'k']
      >>> [s for s in ls if any(c.isdigit() for c in s)]
      ['5 k', '13 k']
      

      any 将在第一个 True 上“短路”,因此它非常有效。

      可以肯定,正则表达式没有问题,但如果您有更大的数据集,这可能会更快。

      【讨论】:

        【解决方案4】:

        您在正则表达式中缺少匹配的 k。试试'^\d+ k$'

        【讨论】:

          【解决方案5】:

          您的正则表达式与您想要的不匹配,而只是一个数字序列的字符串。

          你最好试试'^\d+ k$'

          import re
          y = [x for x in ls if x == re.compile('^\d+ k$')]
          y
          

          【讨论】:

            【解决方案6】:

            正则表达式解决方案还有其他答案,但值得指出的是,您不一定需要使用正则表达式来过滤这些。例如,根据当前内容,您可以过滤掉任何缺少空格的内容(我目前看到的正则表达式解决方案都需要空格)。

            [x for x in ls if ' ' in x]
            

            【讨论】:

              猜你喜欢
              • 2020-04-16
              • 1970-01-01
              • 1970-01-01
              • 2023-02-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-04-01
              • 2021-11-14
              相关资源
              最近更新 更多