import collections
import itertools
import string
def main():
words = ["tree", "bone", "indigo", "developer"]
no_repeated_letters = (set(word) for word in words)
letter_stream = itertools.chain.from_iterable(no_repeated_letters)
counter = collections.Counter(letter_stream)
# set zeros for unseen letters, to match poster's answer.
for letter in string.ascii_lowercase:
if letter not in counter:
counter[letter] = 0
# print result.
for key in sorted(counter):
print(key, counter[key])
if __name__ == '__main__':
main()
Регулярное выражение для соответствия строке, которая не содержит определенного шаблона, является
(?s)^(?!.*DontMatchThis).*$
Если вы используете шаблон без (?s)
(который является встроенной версией флага RegexOptions.Singleline
, который делает .
соответствует символу новой строки LF, а также всем другим символам), поиск DontMatchThis
будет выполняться только в первой строке, и только строка без символов LF будет сопоставлена с .*
.
Детали шаблона :
(?s)
- модификатор DOTALL / Singleline, позволяющий .
сопоставить любому символу ^
- начало строки якорь (?!.*DontMatchThis)
- отрицательный прогноз , проверяющий наличие 0 или более символов (сопоставляется с жадным субпаттерном .*
- ПРИМЕЧАНИЕ ] ленивая .*?
версия (сопоставление как можно меньшего числа символов до следующего подшаблона) может выполнить работу быстрее, если DontMatchThis
ожидается ближе к началу строки) с последующим DontMatchThis
.*
- любой ноль или более символов, как можно больше, до $
- конец строки (см. Якорные символы: Доллар ($
) ).