Это вопрос о том, как считать символы в строке? и выяснить, сколько раз регулярное выражение совпадает с строкой в Python
Я хочу подсчитать все символы алфавита в строке:
'Go until jurong point, crazy.. Available only in bugis n great world la e buffet... Cine there got amore wat...'
Метод str.count()
позволяет подсчитать конкретную букву. Как это сделать для подсчета любой буквы во всем алфавите в строке, используя метод count?
Я пытаюсь использовать регулярное выражение внутри метода count, но он возвращает 0 вместо 83. Код, который я использую:
import re
spam_data['text'][0].count((r'[a-zA-Z]'))
Когда я использую:
len(re.findall((r'[a-zA-Z]'), spam_data['text'][0]))
он возвращает длину 83.
Почему count возвращает 0 здесь?
Вы должны использовать str.count
вместо count.
spam_data['text'].str.count('\w')
0 83
Name: text, dtype: int64
Чтобы получить доступ к первому значению, используйте:
spam_data['text'].str.count('\w')[0]
83
str.count('\w')
работает для spam_data ['text']. str.count ('\ w) (т. е.) столбец данных, но не для индексированной серии, созданной из spam_data [' text ']?
Как это сделать для подсчета любой буквы во всем алфавите в строке, используя метод count?
wrd = 'Go until jurong point, crazy.. Available only in bugis n great world la e buffet... Cine there got amore wat...'
>>>> count = sum([''.join({_ for _ in wrd if _.isalpha()}).count(w) for w in wrd])
>>>> count
83
Объяснение: получите сумму уникальных букв (внутри set
) в wrd
используя понимание списка.
похожий на:
count = []
set_w = set()
for w in wrd:
if w.isalpha():
set_w.add(w)
for w in set_w:
count.append(wrd.count(w))
print(sum(count))
В этом:
spam_data['text'][0].count((r'[a-zA-Z]'))
count
принимает параметр по строке, а не по регулярному выражению, поэтому возвращает 0.
Используйте второй пример.
1
для '[a]'.count(r'[a]')
?
regex
а необработанную строку .
Короткий ответ: вы не использовали регулярное выражение, а строковый литерал и, следовательно, подсчитываете вхождения строки '[a-zA-Z]
.
Поскольку строка формата r'..'
не является регулярным выражением, это строковый литерал. Если вы пишете r'\n'
, вы пишете строку с двумя символами: обратную косую черту и n
. не новая линия. Необработанные строки полезны в контексте регулярных выражений, так как регулярные выражения также используют много эскалации.
Например:
>>> r'\n'
'\\n'
>>> type(r'\n')
<class 'str'>
Но здесь вы таким образом подсчитываете количество раз, когда происходит строка '[a-zA-Z]'
, и если ваш spam_data['text'][0]
буквально не содержит квадратную скобку [
за которой следует a
и т.д., Счетчик будет равна нулю. Или, как указано в документации str.count [Python-doc]:
string.count(s, sub[, start[, end]])
Возвращает число (неперекрывающихся) вхождений подстроки
sub
в строкеs[start:end]
. Значения по умолчанию дляstart
иend
и интерпретация отрицательных значений такие же, как для срезов.)
В случае, если строка довольно большая, и вы не хотите создавать список совпадений, вы можете подсчитать количество элементов:
sum(1 for _ in re.finditer('[a-zA-Z]', 'mystring'))
Однако обычно проще просто использовать re.findall(..)
а затем вычислить количество элементов.
r'..'
не является регулярным выражением, это необработанная строка.count()
не принимаетregex
, оно принимает его как строку.