Regex внутри Findall против Regex внутри счета

1

Это вопрос о том, как считать символы в строке? и выяснить, сколько раз регулярное выражение совпадает с строкой в 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 здесь?

  • 1
    r'..' не является регулярным выражением, это необработанная строка.
  • 2
    count() не принимает regex , оно принимает его как строку.
Теги:
pandas

4 ответа

2
Лучший ответ

Вы должны использовать str.count вместо count.

spam_data['text'].str.count('\w')

0    83
Name: text, dtype: int64

Чтобы получить доступ к первому значению, используйте:

spam_data['text'].str.count('\w')[0]
83
  • 0
    Ты знаешь почему . str.count('\w') работает для spam_data ['text']. str.count ('\ w) (т. е.) столбец данных, но не для индексированной серии, созданной из spam_data [' text ']?
  • 0
    Непонятно, что ты имел в виду здесь. Может быть, пример кода, чтобы заявить о проблеме?
Показать ещё 2 комментария
2

Как это сделать для подсчета любой буквы во всем алфавите в строке, используя метод 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))
1

В этом:

spam_data['text'][0].count((r'[a-zA-Z]'))

count принимает параметр по строке, а не по регулярному выражению, поэтому возвращает 0.

Используйте второй пример.

  • 1
    Тогда почему он возвращает 1 для '[a]'.count(r'[a]') ?
  • 0
    потому что он принимает не regex а необработанную строку .
Показать ещё 2 комментария
1

Короткий ответ: вы не использовали регулярное выражение, а строковый литерал и, следовательно, подсчитываете вхождения строки '[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(..) а затем вычислить количество элементов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню