【问题标题】:python split string but keep delimiterpython拆分字符串但保留分隔符
【发布时间】:2016-10-22 22:12:16
【问题描述】:

在 python 中,我可以轻松地将文件逐行读取到一个集合中,只需使用:

file = open("filename.txt", 'r')
content = set(file)

集合中的每个元素都由实际行和尾随换行符组成。

现在我有一个多行的字符串,我想通过使用正常的集合操作来比较它的内容。

有什么方法可以将字符串转换为set,就像它还包含换行符一样?


编辑:

"In Python, how do I split a string and keep the separators?" 的问题处理了类似的问题,但答案并不容易被其他用例采用。

import re
content = re.split("(\n)", string)

没有预期的效果。

【问题讨论】:

  • 你确定这是你想要的吗?编写 file.read().split('\n') 并将其与您的字符串进行比较会更容易吗?
  • 大多数时候正确的做法是忽略空白,你可以这样做set(line.strip() for line in file)
  • @xenteros 实际上不是,因为那里的答案对于其他用例不是很便携。我在问题的底部添加了一个声明。

标签: python string file


【解决方案1】:

如果您将True 作为可选的keepends 参数传递,str.splitlines() 方法将完全满足您的需求。它在每一行的末尾保留换行符,如果字符串末尾没有换行符,则不会在最后一行添加一个。

text = "foo\nbar\nbaz"
lines = text.splitlines(True)
print(lines) # prints ['foo\n', 'bar\n', 'baz']

【讨论】:

    【解决方案2】:

    这是一个可以完成这项工作的简单生成器:

    content = set(e + "\n" for e in s.split("\n"))
    

    此解决方案在末尾添加了一个额外的换行符。

    【讨论】:

    • 如果最后一行还没有换行符,则比在最后一行添加换行符更糟糕,如果原始文本的最后一行 ,此代码会添加一个完整的额外字符串,其中只有一个换行符确实有一个尾随换行符。所以如果s"foo\nbar\n\baz\n",你的代码会将content 变成一个等于{'foo\n', 'bar\n', 'baz\n', '\n'} 的集合。
    【解决方案3】:

    你也可以反过来做,在读取文件行时删除行尾,假设你用U打开文件以获得通用行尾:

    file = open("filename.txt", 'rU')
    content = set(line.rstrip('\n') for line in file)
    

    【讨论】:

      【解决方案4】:

      这就是你的意思吗?

      >>> from io import StringIO
      >>> someLines=StringIO('''\
      ... line1
      ... line2
      ... line3
      ... ''')
      >>> content=set(someLines)
      >>> content
      {'line1\n', 'line2\n', 'line3\n'}
      

      【讨论】:

        猜你喜欢
        • 2018-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-21
        相关资源
        最近更新 更多