【问题标题】:How to pass a multiple elements of the list to a re.split() function ?如何将列表的多个元素传递给 re.split() 函数?
【发布时间】:2017-04-26 17:45:47
【问题描述】:
f = open('sentences.txt')
lines = [line.lower() for line in f]
print lines[0:5]
words = re.split("\s+", lines[0:5])

使用“打印”它工作得非常好,但是当我尝试在 re.split() 内部做同样的事情时,我得到一个错误“TypeError:预期的字符串或缓冲区”

【问题讨论】:

  • 也许您可以使用五个单独的字符串调用 split 五次,而不是将五个字符串传递给 split
  • 你想做什么?
  • 听起来有点像XY problem

标签: python regex python-2.7


【解决方案1】:

我认为您正在搜索join,即:

words = "".join(lines[0:5]).split()

注意:
不需要re模块,split()就够了。

【讨论】:

    【解决方案2】:

    为什么不只是:

    words = re.split("\s+", ''.join(lines))
    

    split 函数需要一个字符串,然后根据正则表达式将其拆分为子字符串并作为列表返回。传递一个列表并没有多大意义。如果您希望它获取您的字符串列表并单独拆分每个字符串元素,然后返回一个字符串列表列表,您必须自己执行此操作:

    lines_split = []
    for line in lines:
        lines_split.append(re.split("\s+", line))
    

    【讨论】:

      【解决方案3】:

      如您所见,您在函数调用中得到了TypeError,这意味着您传递了函数所期望的错误参数。所以你需要考虑你正在传递什么。

      如果您有调试器或 IDE,您可以逐步查看参数的类型,甚至可以使用 type 打印它,通过

      print(type(lines[0:5]))
      

      返回

      <class 'list'>
      

      所以你需要把它转换成一个字符串。列表中的每个元素都是一个字符串,所以想办法将每一行从列表中取出。一个例子是

      words = [re.split('\s+', line) for line in lines]
      

      我使用list comprehension 来单步执行lines 并单独处理每一行。

      【讨论】:

        【解决方案4】:

        你的re.split('\s+', line) 相当于line.split() 所以你可以写

        words = [line.split() for line in lines]
        

        请参阅documentation for str.split

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多