不使用spli计算字符串中的单词数

2024-04-27 02:35:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了一个问题,我需要在不使用Python中的split()函数的情况下计算字符串中的字数。 我想到了一种方法,在这个方法中,我可以取一个变量word=0,每次字符串中有一个空的空格,它就会递增,但它似乎不起作用,因为它总是给出的计数小于实际计数。在

s="the sky is blue"

def countW(s):
    print(s)
    word=0
    for i in s:
        if i==" ":
            word=word+1
    print(word)
countW(s)

我知道这是一个简单的问题,但我很难理解,我还可以考虑什么,以确保我得到正确的计数。 我考虑的第二种方法涉及太多的循环和数组创建,然后是反字符串转换。 有谁能告诉我一个更简单的方法,我不增加时间复杂性。在


Tags: the方法函数字符串is情况blueword
3条回答

最简单的有状态的有限自动机-字内或外。伪代码:

InsideWord = false
Count = 0
for c in s
    if c is not letter
               InsideWord = false 
    else
         if not InsideWord
               Count++
               InsideWord = true

您还可以使用^{},根据字符是否为字母数字分组,并将所有值相加(True等于1)。在

>>> s = "the sky is blue"
>>> sum(k for (k, g) in itertools.groupby(s, key=str.isalnum))
4

计算空格数是一种很好的方法,在大多数情况下都有效。当然你得加1才能得到正确的字数。在

但是,由于您似乎关心格式不好的字符串,因此必须考虑多个空格、开头和结尾的空白以及标点符号。在

如果您不想使用正则表达式(如Ezsrac的答案),这里有一个替代方法,它将字符、数字和下划线的组合视为单词,就像\w一样。它只统计单词字符和非单词字符之间的所有转换。结尾需要特别注意结尾处的非单词字符(例如"a a ""a a")。在

def is_word_character(c):
    return 'a' <= c <= 'z' or 'A' <= c <= 'Z' or '0' <= c <= '9' or c == '_'

def word_count(str):
    c = 0
    for i in range(1, len(str)):
        if not is_word_character(str[i]) and is_word_character(str[i-1]):
            c += 1
    if is_word_character(str[-1]):
        c += 1
    return c

以下是一些测试用例:

^{pr2}$

如果您还想包含其他字符,您可以简单地扩展is_word_character函数,但是要知道,如果不使用非常先进的技术,就不可能考虑所有的角点情况。例如,{cd6>}。这样一个简单的程序不可能识别出第一个是复合形容词,而第二个是由两个连接不好的句子组成的。在

相关问题 更多 >