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

时间:2017-12-06 10:19:18

标签: python string match any

我有以下脚本

#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")

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

提前致谢。

3 个答案:

答案 0 :(得分:0)

改变这个:

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()通过迭代器尝试查找返回True任何值,但不会告诉您它是哪一个。
  • next()只会返回返回True next 值。这里的问题是可能有多个这样做。如果您想要全部,请不要使用next

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

答案 1 :(得分:0)

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")

答案 2 :(得分:0)

只需将列表理解中的any更改为列表循环:

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