【问题标题】:Python regex in lists列表中的 Python 正则表达式
【发布时间】:2016-09-27 02:05:38
【问题描述】:

我有一个列表,其中包含在构建服务器中构建的不同软件的列表。我只想要特定的。我已经为它编写了正则表达式,但得到了空字符串。代码在这里:

#!/usr/bin/env python
import re

lists = ['sw_apple-mc-stded-date.dat', 'sw_apple-mc-prod-date.dat', 'sw_android-mc-prod-date.dat', 'sw_android-mc-stded-date.dat']
regex = re.compile('sw_apple-mc-stded')
for list in lists:
    firmware = regex.findall(list)
return firmware

我得到的是一个空的固件列表,而不是“sw_apple-mc-stdeb-date.dat”。提前谢谢你。

【问题讨论】:

  • stded 不是 stdeb
  • 你知道你不需要正则表达式来破解这个吗? (除非我们遗漏了细节……)
  • regex.findall(list) 也许?顺便说一句,filelist 都是名称的选择。他们用该名称掩盖内置。
  • 另外你的代码只会返回你上次检查的结果,没有别的。
  • 进行了相应的更改。请检查编辑。

标签: python regex list


【解决方案1】:

我不知道您为什么使用regex = re.compile('sw_apple-mc-stdeb'),因为您可以简单地检查列表项是否有字符串匹配

weird_lists = ['sw_apple-mc-stded-date.dat', 'sw_apple-mc-prod-date.dat', 'sw_android-mc-prod-date.dat', 'sw_android-mc-stded-date.dat']

for item in weird_lists:
    if "sw_apple-mc-stded" in item:
        print item

在您的代码中,通过:

for list in lists:
    firmware = regex.findall(list)
return firmware

如果它与您的“正则表达式”匹配,则返回固件返回您上次迭代的项目列表,因为只有 1 个项目并且它与您的“正则表达式”不匹配,因此返回的列表为空。如果您在代码中添加打印,您将看到第一次迭代返回列表项,然后返回三个空列表

【讨论】:

  • 你在期待什么?结果是'sw_apple-mc-stded-date.dat'
  • 我期待字符串“sw_apple-mc-stded-date.dat”。但是得到空字符串。谢谢。
  • 您使用的方法并不真正值得使用正则表达式。正如@Klaus D. 提到的,它返回一个空列表,因为您遍历所有列表项并逐个查找查找,最后一项不匹配,因此列表为空
【解决方案2】:

findall() 只会返回字符串的匹配部分。更大的问题是您在每次循环迭代中都覆盖了firmware,这就是为什么如果最后一个列表元素中没有匹配项,它最终是空的:

regex = re.compile('sw_apple-mc-stded.*')  # add wildcard at the end to match entire string
firmware = []
for list in lists:
    firmware.extend(regex.findall(list))  # extend as findall returns a list
return firmware

但是,对于这个任务,我认为一个简单的包含检查就可以了:

prefix = 'sw_apple-mc-stded'
firmware = [s for s in lists if prefix in s]
# firmware = [s for s in lists if s.startswith(prefix)]
return firmware

【讨论】:

    猜你喜欢
    • 2012-09-02
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2013-11-24
    相关资源
    最近更新 更多