Regex внутри Findall против Regex внутри счета - PullRequest
0 голосов
/ 19 октября 2018

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

Почему отсчет возвращает 0 здесь?

Ответы [ 4 ]

0 голосов
/ 19 октября 2018

Как можно это сделать для подсчета любой буквы во всем алфавите в строке, используя метод подсчета?

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))
0 голосов
/ 19 октября 2018

В этом:

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

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

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

0 голосов
/ 19 октября 2018

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

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

0    83
Name: text, dtype: int64

Для доступа к первому значению используйте:

spam_data['text'].str.count('\w')[0]
83
0 голосов
/ 19 октября 2018

Краткий ответ : вы не использовали регулярное выражение, а необработанный строковый литерал и, таким образом, рассчитали вхождения строки '[a-zA-Z].

Поскольку строка формата r'..' является , а не регулярным выражением, это raw string литерал .Если вы пишете r'\n', вы пишете строку с двумя символами: обратной косой чертой и n. не новая строка.Необработанные строки полезны в контексте регулярных выражений, потому что регулярные выражения также используют много экранирующих символов.

Например:

>>> r'\n'
'\\n'
>>> type(r'\n')
<class 'str'>

Но здесь вы, таким образом, подсчитываете, сколько раз string '[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(..) и затем вычислить количество элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...