我有一个短语列表,每个短语的长度不应超过5个字,我想看看这些短语中是否有任何一个短语。
我想写这样的东西:
my_phrases = ['Hello world', 'bye world', 'something something'....]
my_regex = re.compile('|'.join(my_phrases))
my_iter = re.finditer(my_regex, text)
但我有点担心这(第2行)不被认为是一种好习惯。有人能告诉我这是否可行?如果没有,在文本中匹配多个短语的最佳方法是什么?
答案 0 :(得分:2)
我想说你的方法只缺少一件好事:处理原始短语列表中的特殊字符:想象列表是
['oh, really?', 'definitely!', 'no, never.']
那么你的正则表达式也会匹配"哦,这就是"因为?意味着" y"成为可选的,它也会匹配"不,无休止的故事"因为"。"意味着"任何角色"。
制作代码"最佳实践"你需要将字符串传递给一个逃避这些特殊字符的函数,幸运的是re.escape
就是这样一个函数,所以你可以简单地用它来map
所有的字符串:
my_phrases = ['Hello world', 'bye world', 'something something'....]
my_regex = re.compile('|'.join(map(re.escape, my_phrases)))
my_iter = re.finditer(my_regex, text)
或(更具可读性):
my_phrases = ['Hello world', 'bye world', 'something something'....]
my_phrases_escaped = map(re.escape, my_phrases)
my_regex = re.compile('|'.join(my_phrases_escaped))
my_iter = re.finditer(my_regex, text)
答案 1 :(得分:1)
从'最佳做法'的角度来看,我没有看到任何问题。毕竟,我能想到的唯一算法是一个接一个地尝试这些短语,直到一个匹配。你的正则表达式确实如此。如果你想将它与两个空格而不是一个空格匹配到“Hello world”,那么它可能有点过于严格。在这种情况下,正则表达式是要走的路,你只需要制作它们'Hello\s+world'
等等。