Возможно, вы захотите использовать маркер границы слова \b
. Это пустое совпадение для переходов между \w
и \W
. Если вы хотите, чтобы ваши ключевые слова были буквальными строками, вам сначала нужно экранировать . Вы можете объединить все в одно регулярное выражение, используя |
:
pattern = re.compile(r'\b(' + '|'.join(map(re.escape, keyword)) + r')\b')
OR
pattern = re.compile(r'\b(?' + '|'.join(re.escape(k) for k in keyword) + r')\b')
Вычисление совпадений теперь немного проще, так как вы можете использовать finditer
вместо того, чтобы создавать свое собственное понимание:
matches = pattern.finditer(line)
Поскольку каждое совпадение заключено в группу, печать не намного сложнее:
result = "{:<15} {}".format(','.join(m.group() for m in matches), lineno)
OR
result = "{:<15} {}".format(','.join(map(re.Match.group(), matches)), lineno)
Конечно, не забудьте
import re
Угловой чехол
Если у вас есть ключевые слова, которые являются подмножествами друг друга с одинаковым префиксом, убедитесь, что более длинные слова идут первыми. Например, если у вас есть
keyword = ['foo', 'foobar']
регулярное выражение будет
\b(foo|foobar)\b
Когда вы встречаете строку с foobar
в ней, foo
будет успешно сопоставляться с ней, а затем с ошибкой \b'. This is documented behavior of
| `. Решение состоит в том, чтобы предварительно отсортировать все ваши ключевые слова, уменьшив длину перед созданием выражения:
keywords.sort(key=len, reversed=True)
Или, если возможен ввод не в списке:
keywords = sorted(keywords, key=len, reversed=True)
Если вам не нравится этот порядок, вы всегда можете распечатать его в каком-то другом порядке после того, как совпадете.