【问题标题】:How to iterate over a list while applying a regex to it in Python?如何在 Python 中对列表应用正则表达式时对其进行迭代?
【发布时间】:2020-12-09 07:12:29
【问题描述】:

我正在尝试运行这段代码。

castResultType = list(filterResultSet[1:32:5]) 
cleanList = []

for i in castResultType:
    cleanList.append(re.sub('[^\d\.]', '',castResultType[i]))

print(cleanList)

我希望基本上得到列表castResultType 中的每个项目,它从列表filterResultSet 中获取特定值,插入到空列表cleanList 中。同时将上述正则表达式应用于castResultType 中的每个值,然后再将其插入cleanList。我确定我做错了什么,并希望得到任何帮助。总的来说,我对 python 和编程也很陌生,所以如果我问一些愚蠢的问题,我很抱歉。

【问题讨论】:

  • 您是否收到错误消息或错误结果?显示错误和一些具有预期结果的数据以及你得到的结果。我不明白你的问题是什么
  • 如果castResultType 是一个列表并且您使用for i in castResultType:,那么您必须使用i 而不是castResultType[i]for 为您提供此列表中的价值,而不是其索引。 re.sub('[^\d\.]', '', i)
  • @furas 所以我尝试在 castResultType 中运行这个 castResultType = list(filterResultSet[1:32:5]) cleanList = [] for i: cleanList.append(re.sub('[^\d .]', '',i)) print(cleanList) 但我收到错误“预期的字符串或类似字节的对象”,并且 filterResultSet 是一个 html 标记列表,其数据值包含在两个 标记之间。我正在尝试从标签中删除除值之外的每个字符。
  • @furas,当我将 i 转换为 str 时,我让它工作了。我很欣赏 i 实际上是价值而不是索引的洞察力。
  • 用一些数据更好地创建最小的工作代码 - 我不知道 filterResultSet 是什么以及它是如何工作的。如果它是 HTML 标签,那么也许您应该首先获取不带标签的值/文本 - 作为字符串。

标签: python python-3.x regex loops for-loop


【解决方案1】:

您(可能)面临的问题在这一行:for i in castResultType

这一行正在循环我们的(list) castResultType 中的值并将其元素分配给i。但是,当您调用 castResultType[i] 时,您要求的是一个不存在的列表索引。

你可能打算做的是:

for i in range(len(castResultType)):
    cleanList.append(re.sub('[^\d\.]', '',castResultType[i]))
# etc

你还可以做的是:

for i in castResultType:
   cleanList.append(re.sub('[^\d\.]', '', i))
# etc

还有很多其他方法可以编写您想做的代码,但对于初学者来说,这些可能是最熟悉的。

除了循环中的错误之外,问题还可能在于您使用正则表达式。我建议在循环之前在 castResultType 的单个元素上试验你的正则表达式。

【讨论】:

    【解决方案2】:

    您可以使用内置的map 函数将函数映射到可迭代对象中的项:

    clean_list = list(map(lambda elem: re.sub('[^\d\.]', '', elem), castResultType))
    

    【讨论】:

    • 知道如何在初始 for 循环之后再次使用 clean_list 的 map 函数来执行此操作,而不是为 castResultType 执行此操作吗?例如,如果我正在运行两个正则表达式语句?我尝试运行 clean_list = list(map(lambda elem: re.sub('[^\d\.]', '', elem), cleanList)) 并且它仍然在列表中返回非数值。我最初在第一个正则表达式上也使用了不同的 sub,这就是我再次使用 [^\d\.] 运行的原因。如果您能对此提供一些见解,我将不胜感激。
    • @randomguy2443 您是否要删除所有非数字字符?如果是这样,您应该可以使用re.sub([^\d]*, '', elem)。无论哪种方式,您都可以定义自己的函数clean,它接受一个字符串并返回清理后的版本。然后将 lambda 函数替换为 clean。这是将多个函数应用于可迭代元素的直接方式。
    • 非常感谢!这正是我一直在寻找的,我学到了一些新东西。对此,我真的非常感激。为你投了赞成票,但因为我的分数低于 15 分,所以没有显示遗憾。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签