[英]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.