我正在尝试读取文件并匹配其中包含超过6个字符的单词。但我一直收到这个错误:
Traceback (most recent call last):
File "dummy.py", line 9, in <module>
matches = re.findall("\w{6,}", f.read().split())
File "/usr/lib/python2.7/re.py", line 181, in findall
return _compile(pattern, flags).findall(string)
TypeError: expected string or buffer
我无法弄清楚为什么会收到此错误?代码粘贴在
下面import re
with open('test.txt', 'r') as f:
matches = re.findall("\w{6,}", f.read().split())
nr_long_words = len(matches)
print (matches)
答案 0 :(得分:1)
f.read().split()
给出了一个字符串列表,但re.findall
需要一个字符串,即TypeError: expected string or buffer
。您可以将正则表达式应用于循环或列表推导中的每个子字符串,但您根本不需要split()
:
matches = re.findall("\w{6,}", f.read())
请注意,如果文件非常大,那么f.read()
可能不是一个好主意(但对于文本文件来说,它可能不是问题,因为它们很少是几兆字节,如果有的话)。在这种情况下,您可以逐行读取文件并总结每行的长字:
nr_long_words = sum(len(re.findall(r"\w{6,}", line)) for line in f)
此外,正如评论中所述,\w{6,}
可能不是“长话”开头的最佳正则表达式。例如,\w
也会匹配数字或下划线_
。如果你想匹配(ascii-)字母,最好使用[A-Za-z]
,但这可能会导致非ascii字母出现问题,例如变音符号,重音符号,阿拉伯语等。另外,你可能想要包含单词边界字符,即\b
,以确保六个字母不是较长的非单词序列的一部分,即使用像r'\b[A-Za-z]{6,}\b'
答案 1 :(得分:0)
尝试:
int findPosition(std::string userName, int namePosition = 0);
它应该打印文件中超过6个字符的单词数。