Python 在不使用拆分的情况下计算字符串中的单词数

Python 在不使用拆分的情况下计算字符串中的单词数,python,algorithm,Python,Algorithm,我遇到了一个问题,我需要在不使用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(w

我遇到了一个问题,我需要在不使用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)
我知道这是一个简单的问题,但我很难理解还有什么可以考虑,以确保我得到正确的计数。 我想到的第二种方法涉及太多的循环和数组创建,然后是返回字符串转换。
有谁能告诉我一个更简单的方法,在这里我不会增加时间复杂度。

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

但是,由于您似乎关心的是格式不好的字符串,所以必须考虑多个空白,在开始和结束时加空白,以及标点符号。

如果您不想使用正则表达式(如Ezsrac的回答中所述),这里有一个替代方案,它将字符、数字和下划线的组合视为单词,就像
\w
一样。它只是统计单词字符和非单词字符之间的所有转换。结束时需要特别注意结尾处的非单词字符(例如<代码> >一个“< /代码> vs.代码>”一个“< /代码>”。


如果你还想包括其他字符,你可以简单地扩展<代码> iSyWord字符函数,但是要知道不使用非常先进的技术不可能考虑所有的角情况。例如,考虑<代码>“你好看”<代码> VS>代码>这是好看的天空“”。这样一个简单的程序不可能识别出第一个是复合形容词,而第二个是由两个链接不好的句子组成的。

如果你真的不想使用split,你可以试试regex:

import re
s= "the sky is blue"
count = len(re.findall(r'\w+', s))
print (count)
您还可以使用,根据字符是否为字母数字进行分组,并对所有值求和(
True
equaling
1


最简单的有状态的有限自动机——在一个词内或词外。伪代码:

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

def countW(s):s中i的print(s)word=0:if i==“”:word=word+1 print(word)countW(s)
s.count(“”+1
应该这样做。使用split对字符串进行计数的可能重复是无效的,因为它创建了一个列表。最好数一数空格并加1。如果你担心格式不好的字符串、错误的语法等,这个问题显然是不够明确的。在一般意义上,这甚至可能是不可能的。例如,“你长得很好看”与“这是一个很好看的天空”计算机应该如何确定第一个是复合形容词,而第二个是由两个连接不好的句子组成的?我只是尝试了一下,但我只是想知道它是否适合所有的边缘情况,或者他们的方法是否比这个更好,避免使用Python直接函数,如count()或split()@Faith lost,因为您关心边缘情况,我添加了另一个解决方案。如果有人输入了格式不正确的字符串,那么您提到的代码将失败。Ex:str=“天是蓝的。你肯定应该在问题中完善你的要求!什么是单词?请记住,单词可以由大量的函数间字符和空格字符分隔,因此不建议只检查空格。我会创建一个像
word\u bounders=set([“”,“\n”,“,”,“!”,“:”])
这样的集合,然后在word\u bounders中使用if
if str[I]…
来消除边缘情况。您好,非常感谢您提到的regex-one至少通过了直接空间计数失败的测试用例。Ex--s=“天空是蓝色的。the”给出了5的正确答案
import re
s= "the sky is blue"
count = len(re.findall(r'\w+', s))
print (count)
>>> s = "the sky is blue"
>>> sum(k for (k, g) in itertools.groupby(s, key=str.isalnum))
4
InsideWord = false
Count = 0
for c in s
    if c is not letter
               InsideWord = false 
    else
         if not InsideWord
               Count++
               InsideWord = true