findall内部的正则表达式与内部计数的正则表达式

时间:2018-10-18 21:26:37

标签: python regex pandas

这是How to count characters in a string?Find out how many times a regex matches in a string in 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 :(得分:2)

您应该使用str.count而不是计数。

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

0    83
Name: text, dtype: int64

要访问第一个值,请使用:

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

答案 1 :(得分: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))

答案 2 :(得分:1)

简短答案:您不是使用正则表达式,而是使用raw string literal,因此计算了字符串'[a-zA-Z]的出现次数。

因为格式r'..'的字符串不是正则表达式,所以它是 raw 字符串 literal 。如果您写r'\n',则会写一个包含两个个字符的字符串:反斜杠和一个n不是换行。原始字符串在正则表达式的上下文中很有用,因为正则表达式也使用了很多转义。

例如:

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

但是在这里,您需要计算字符串 '[a-zA-Z]'出现的次数,除非您的spam_data['text'][0]字面包含方括号[,后跟{{ 1}}等,计数将为零。或如str.count [Python-doc]的文档中所述:

  

a

     

返回字符串string.count(s, sub[, start[, end]])子字符串 sub的(不重叠)出现次数。 s[start:end]start的默认设置以及负值的解释与切片相同。)

如果字符串很大,并且您不想构造一个匹配列表,则可以使用以下方法计算元素的数量:

end

但是,通常简单地使用sum(1 for _ in re.finditer('[a-zA-Z]', 'mystring')) 然后计算元素数通常会更快。

答案 3 :(得分:1)

在这个:

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

count通过字符串接受参数,不是正则表达式,这就是为什么它返回0的原因。

使用第二个示例。