Регулярное выражение, вероятно, будет лучшим подходом. Но в любом случае ...
Это не решение регулярных выражений
В этой реализации предполагается, что любой символ или последовательность символов в алфавитном порядке c set
засчитываются как одно слово. Так, например, он будет считать такие вещи, как имена идентификаторов в блоках кода.
Слова учитываются отдельно и разделяются любым не-алфавитным символом c; пробелы, табуляции, точки с запятой и косые черты, например. Если вы хотите считать слова с апострофами или дефисами в одном - добавьте их к набору chars
.
>>> chars = set('abcdefghijklmnopqrstuvwxyz'
... 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
... '0123456789'
... '_') # Underscores to match identifiers?
... # "-'") Are these separators or parts of a word?
...
>>> def count_alphanum_words(s):
... w = False
... count = 0
... for ch in s:
... if ch in chars:
... w = True
... else:
... if w:
... count += 1
... w = False
... if w:
... count += 1
... return count
...
>>> count_alphanum_words("Th3 qu1ck 8r0wn f0x jump3d 0v3r th3 l4zy d0g.")
9
>>> line_details = []
>>> for n, line in enumerate(csv, 1):
... count = count_alphanum_words(line)
... line_details.append("Line %d has %d Alphanumeric words" % (n, count))
...
>>> for line in line_details:
... print(line)
Алгоритм должен быть быстрым, так как он проходит только один проход через символы на строка, чтобы получить количество слов. Другие подходы, использующие split()
, включают в себя один проход для выполнения разбиений, затем другой проход для обработки списка элементов, которые он производит, плюс итерацию по символам отдельных слов, чтобы определить, являются ли они alphanumeri c.
Однако решения с split()
и isalnum()
выполняют больше операций в собственном коде. Таким образом, разница во времени исполнения этого кода по сравнению с другими решениями незначительна. Однако другие решения могут неправильно подсчитывать слова.