Python: использование .isalpha () для подсчета определенных слов / символов в подсчете слов - PullRequest
0 голосов
/ 21 октября 2019

Я создал функцию, которая может считать определенные слова или символы в текстовом файле.

Но я хочу создать условие, при котором функция считает символ только в том случае, если он окружен буквами. Например, в текстовом файле.

'This test is an example, this text doesn't have any meaning. It is only an example.'

Если бы мне пришлось пропустить этот текст через мою функцию, проверяя количество апострофов ('), он вернет 3. Однако я хочу, чтобы он возвратил 1,только для апострофов в пределах 2 букв (например, нет или не будет), но я хочу, чтобы он игнорировал все остальные апострофы, такие как одинарные кавычки, которые не заключены в буквы.

У меня естьпопытался использовать метод .isalpha (), но у меня проблемы с синтаксисом.

Ответы [ 4 ]

0 голосов
/ 21 октября 2019

Вы должны просто использовать регулярное выражение:

import re

text = "'This test is an example, this text doesn't have any meaning. It is only an example.'"

wordWrappedApos = re.compile(r"\w'\w")
found = re.findall(wordWrappedApos, text)
print(found)
print(len(found))

Замените "\ w" на "[A-Za-z]", если вы хотите убедиться, что там нет чисел.

0 голосов
/ 21 октября 2019

Если вы просто хотите сбрасывать со счетов кавычки, в которые заключена сама строка, самый простой способ может заключаться в strip исключении из строки перед подсчетом.

>>> text = "'This test is an example, this text doesn't have any meaning. It is only an example.'"
>>> text.strip("'").count("'")
1

Другой способ был бы срегулярное выражение типа \w'\w, то есть буква, за которой следует ', за которой следует буква:

>>> sum(1 for _ in re.finditer("\w'\w", text))
1

Это также работает для кавычек внутри строки:

>>> text = "Text that has a 'quote' in it."
>>> sum(1 for _ in re.finditer("\w'\w", text))
0

Но это будеттакже пропустите апострофы, за которыми не следует еще одна буква:

>>> text = "All the houses' windows were broken."
>>> sum(1 for _ in re.finditer("\w'\w", text))
0
0 голосов
/ 21 октября 2019

Как уже отмечал xnx, правильный способ сделать это с помощью регулярных выражений:

import re

text = "'This test is an example, this text doesn't have any meaning. It is only an example.'"

print(len(re.findall("[a-zA-Z]'[a-zA-Z]", text)))
"""
Out:
    1
"""

Здесь апостроф в шаблоне окружен набором английских букв, но есть ряд предопределенныхнаборы символов см. в документах RE .

0 голосов
/ 21 октября 2019

Я думаю, что регулярные выражения были бы лучше для этого, но если вы должны использовать isalpha, что-то вроде:

s = "'This test is an example, this text doesn't have any meaning. It is only an example.'"
sum(s[i-1].isalpha() and s[i]=="'" and s[i+1].isalpha() for i in range(1,len(s)-1))

возвращает 1.

...