繁体   English   中英

计算字母数字单词的最佳方法是什么?

[英]What's the best way to count alphanumeric words?

我正在尝试找到不使用正则表达式来计算字母数字单词的最佳方法,这就是我所做的。

for line in csv:
        total_lines += 1
        total_words = len(line.split())
        line_char_count =  sum(map(str.isalnum, line.split()))
        line_details.append("Line %d has %d Alphanumeric word/s" % (total_lines, line_char_count))

for line in line_details:
print (line)

它不计算字母数字词,而是排除字母数字词并计算非字母数字词。 所以我尝试了另一种方法:

for line in csv:
        total_lines += 1
        total_words = len(line.split())
        line_char_count =  sum(map(str.isalnum, line.split()))
        count = total_words - line_char_count
        line_details.append("Line %d has %d Alphanumeric word/s" % (total_lines, count))

for line in line_details:
print (line)

我从字符串的总字数中扣除了 line_char_count。 现在,它给了我一个接近的答案,但标点符号仍然被计算在内。 我不知道去除标点符号的最佳方法是什么。 或者,如果您有更好的方法来计算字母数字单词,请帮助我。 谢谢

正则表达式可能是最好的方法。 但不管怎么说...

这不是正则表达式解决方案

此实现假定字母数字set的任何字符或字符序列都被计为一个单词。 因此,例如,它会计算代码块中的标识符名称等内容。

由任何非字母数字字符分隔的单词单独计算; 例如空格、制表符、分号和斜杠。 如果您想将其中带有撇号或连字符的单词计数为一个 - 将它们添加到chars集中。

>>> chars = set('abcdefghijklmnopqrstuvwxyz'
...             'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
...             '0123456789'
...             '_')     # Underscores to match identifiers?
...             # "-'")    Are these separators or parts of a word?
...
>>> def count_alphanum_words(s):
...     w = False
...     count = 0
...     for ch in s:
...         if ch in chars:
...             w = True
...         else:
...             if w:
...                 count += 1
...                 w = False
...     if w:
...         count += 1
...     return count
...     
>>> count_alphanum_words("Th3 qu1ck 8r0wn f0x jump3d 0v3r th3 l4zy d0g.")
9
>>> line_details = []
>>> for n, line in enumerate(csv, 1):
...     count = count_alphanum_words(line)
...     line_details.append("Line %d has %d Alphanumeric words" % (n, count))
...
>>> for line in line_details:
...     print(line)

该算法应该很快,因为它只需要通过一行中的字符来获得字数。 使用split()的其他方法会导致一次传递进行拆分,然后再传递一次以处理它生成的项目列表,以及对单个单词的字符进行迭代以确定它们是否是字母数字。

但是,使用split()isalnum()的解决方案在本机代码中执行更多操作。 因此,此代码与其他解决方案的性能时间差异可以忽略不计。 但是,其他解决方案可能无法正确计算单词。

这是在假设“word”是任何非空白字符的字符串的情况下编写的:

for i, line in enumerate(csv, 1):
    alnum_words = sum(1 for word in line.split() if word.isalnum())
    line_details.append("Line %d has %d Alphanumeric word/s" % (i, alnum_words))

这是你想要的吗?

line = "Rolls-Royce Motor Cars Inc. said it expects its U.S. sales to remain steady at about 1,200 cars in 1990"   
line_char =  sum(i.isalnum() for i in line.split())

print(line_char)

Output:15

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM