3 回答
TA贡献1821条经验 获得超4个赞
s.join不会做你认为它会做的事情。还要考虑文件中的行有一个换行符 ( '\n') 所以.endswith('\\')不会因为这个原因被捕获。
像这样的东西(虽然方法有些不同)
output = ''
with open('/path/to/file.txt') as f:
for line in f:
if line.rstrip().endswith('\\'):
next_line = next(f)
line = line.rstrip()[:-1] + next_line
output += line
在上面,我们曾经line.rstrip()读取任何尾随空格(换行符),以便该.endswith方法正确匹配。
如果一行以 结尾\,我们继续使用内置函数将下一行从文件生成器中拉出next。
最后,我们组合该行和下一行,注意再次删除空格 ( .rstrip()) 和\字符([:-1]表示直到最后一个字符的所有字符)并取新行并将其添加到输出中。
结果字符串像这样打印出来
: Student 1
: Student 2 Student 3
注意s.join... 最好将其解释为 ,的反义词split,s用作分隔符(或连接)字符。
>>> "foo.bar.baz".split('.')
['foo', 'bar', 'baz']
>>> "|".join(['foo', 'bar', 'baz'])
'foo|bar|baz'
TA贡献1725条经验 获得超7个赞
如果您可以读取完整文件而不将其拆分为行,则可以使用正则表达式:
import re
text = """
: Student 1
: Student 2 \
Student 3
""".strip()
print(re.sub(r'\\\s*\n[^:]', ' ', text))
: Student 1
: Student 2 Student 3
正则表达式匹配出现的\后跟新行和不是:.
TA贡献1794条经验 获得超7个赞
如果以字符串列表开头,则可以使用regex和join来避免循环。
l = ['a\\', 'b','c']
s = '_'.join(l)
lx = re.split(r'(?<!\\)_', s) # use negative lookbehind to only split underscore with no `\` before it
[e.replace('\\_', '') for e in lx] # replace with '', ' ' if you need so.
输出:
['ab', 'c']
添加回答
举报