Return 字符串中 any() 列表中的匹配值

Return matched value in any() list in string

我有以下脚本

#Tails every new line created in this file
for line in tailer.follow(open("my/path/chatlog.html")):
    #If the new line has the word "TURN" on it, continue
    if("TURN" in line):
        #IF any of the names in the list characterNames is in the new line, execute the function parseCharacter passing the matched "name"
        if any(name in line.lower() for name in characterNames):
            parseCharacter(charactersPath + name + ".xml")

最后一行的"name"是我需要匹配的行中的匹配名称。我试图查看 any() 文档,但找不到解决方案。

提前致谢。

改变这个:

if any(name in line.lower() for name in characterNames):
    parseCharacter(charactersPath + name + ".xml")

为此:

try:
    bingo = next(name for name in characterNames if name in line.lower()):
except StopIteration:  # none found
    # break \ continue ?
else:
    parseCharacter(charactersPath + bingo + ".xml")

  • any() 通过迭代器试图找到 any 值 returns True 但不告诉你它是哪一个.
  • next() 只会 return 下一个 值 return 的 True。这里的问题是可能有多个这样做。如果你想获得它们,请不要使用 next all.

最后,请注意 next() 也可以采用默认参数,以防万一找不到任何内容。你可能想用那个。如果这样做,则不需要 except 部分。它在内部处理。

if any(name in line.lower() for name in characterNames):
    parseCharacter(charactersPath + name + ".xml")

name 只在括号内有效。之后名称不再定义。

您必须手动浏览列表:

for name in characterNames:
    if name in line.lower():
        parseCharacter(charactersPath + name + ".xml")

只需将 any 更改为列表推导中的列表循环即可:

for name in [name for name in characterNames if name in line.lower()]:
    parseCharacter(charactersPath + name + ".xml")