【问题标题】:TypeError: expected string or bufferTypeError:预期的字符串或缓冲区
【发布时间】:2013-04-18 02:16:05
【问题描述】:

我有这个简单的代码:

import re, sys

f = open('findallEX.txt', 'r')
lines = f.readlines()
match = re.findall('[A-Z]+', lines)
print match

我不知道为什么会出现错误:

'预期的字符串或缓冲区'

谁能帮忙?

【问题讨论】:

  • f.readlines() 替换为f.read()
  • 如果行是None,您将在此处得到与输入列表相同的错误。在相同的情况下,re.sub 也会发生这种情况。因此它是一个 TypeError (输入了错误的类型)。我之所以提到这一点,是因为我搜索了导致此错误的原因并找到了您的帖子(我偶然发现了一个 Nonetype)。

标签: python regex


【解决方案1】:

lines 是一个列表。 re.findall() 不接受列表。

>>> import re
>>> f = open('README.md', 'r')
>>> lines = f.readlines()
>>> match = re.findall('[A-Z]+', lines)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/lib/python2.7/re.py", line 177, in findall
    return _compile(pattern, flags).findall(string)
TypeError: expected string or buffer
>>> type(lines)
<type 'list'>

来自help(file.readlines)。 IE。 readlines() 用于循环/迭代:

readlines(...)
    readlines([size]) -> list of strings, each a line from the file.

要查找文件中的所有大写字符:

>>> import re
>>> re.findall('[A-Z]+', open('README.md', 'r').read())
['S', 'E', 'A', 'P', 'S', 'I', 'R', 'C', 'I', 'A', 'P', 'O', 'G', 'P', 'P', 'T', 'V', 'W', 'V', 'D', 'A', 'L', 'U', 'O', 'I', 'L', 'P', 'A', 'D', 'V', 'S', 'M', 'S', 'L', 'I', 'D', 'V', 'S', 'M', 'A', 'P', 'T', 'P', 'Y', 'C', 'M', 'V', 'Y', 'C', 'M', 'R', 'R', 'B', 'P', 'M', 'L', 'F', 'D', 'W', 'V', 'C', 'X', 'S']

【讨论】:

    【解决方案2】:

    lines 是一个字符串列表,re.findall 不适用于它。试试:

    import re, sys
    
    f = open('findallEX.txt', 'r')
    lines = f.read()
    match = re.findall('[A-Z]+', lines)
    print match
    

    【讨论】:

      【解决方案3】:

      readlines() 将返回文件中所有行的列表,因此lines 是一个列表。你可能想要这样的东西:

      for line in f.readlines(): # Iterates through every line and looks for a match
      #or
      #for line in f:
          match = re.findall('[A-Z]+', line)
          print match
      

      或者,如果文件不是太大,您可以将其作为单个字符串抓取:

      lines = f.read() # Warning: reads the FULL FILE into memory. This can be bad.
      match = re.findall('[A-Z]+', lines)
      print match
      

      【讨论】:

      • 实际上,您可以(甚至应该)完全跳过readlinesfor line in f:
      【解决方案4】:

      您的 sn-p 中的“行”术语由一组字符串组成。

       lines = f.readlines()
       match = re.findall('[A-Z]+', lines)
      

      您不能将整行发送到re.findall('pattern',&lt;string&gt;)

      你可以尝试逐行发送

       for i in lines:
        match = re.findall('[A-Z]+', i)
        print match
      

      或将整个行集合转换为单行(每行由空格分隔)

       NEW_LIST=' '.join(lines)
       match=re.findall('[A-Z]+' ,NEW_LIST)
       print match
      

      这可能对你有帮助

      【讨论】:

        【解决方案5】:

        re.findall 在字符串中查找所有出现的正则表达式并在列表中返回。在这里,你使用的是一个字符串列表,你需要这个来使用 re.findall

        注意 - 如果正则表达式失败,则返回一个空列表。

        import re, sys
        
        f = open('picklee', 'r')
        lines = f.readlines()  
        regex = re.compile(r'[A-Z]+')
        for line in lines:
             print (re.findall(regex, line))
        

        【讨论】:

          猜你喜欢
          • 2016-01-24
          • 2020-04-02
          • 1970-01-01
          • 1970-01-01
          • 2018-04-28
          • 2016-07-15
          • 2016-07-31
          相关资源
          最近更新 更多