Python:尝试使用正则表达式匹配和计算单词(预期的字符串或缓冲区)

时间:2016-03-19 22:19:49

标签: regex python-2.7

我正在尝试读取文件并匹配其中包含超过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)

2 个答案:

答案 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个字符的单词数。