我有一个字符串,我试图根据空行拆分成块。
给定一个字符串s
,我想我可以这样做:
re.split('(?m)^\s*$', s)
这在某些情况下有效:
>>> s = 'foo\nbar\n \nbaz'
>>> re.split('(?m)^\s*$', s)
['foo\nbar\n', '\nbaz']
但如果该行完全为空则它不起作用:
>>> s = 'foo\nbar\n\nbaz'
>>> re.split('(?m)^\s*$', s)
['foo\nbar\n\nbaz']
我做错了什么?
[python 2.5;如果我使用'^\s*$'
编译re.MULTILINE
并使用编译的表达式而不是没有区别]
答案 0 :(得分:17)
请改为尝试:
re.split('\n\s*\n', s)
问题在于“$ * ^”实际上只匹配“单独在一行上的空格(如果有的话)” - 而不是新行本身。当线上没有任何东西时,这会使分隔符变空,这没有意义。
这个版本也摆脱了分界新行本身,这可能是你想要的。否则,您将在每个拆分部分的开头和结尾都插入换行符。
将多个连续的空行视为定义空块(“abc \ n \ n \ ndef” - > [“abc”,“”,“def”])比较棘手...
答案 1 :(得分:3)
re库可以拆分一个或多个空行!空行是由零个或多个空格组成的字符串,从行的开头开始,到行的末尾结束。特殊字符'$'匹配字符串的结尾或在字符串末尾的换行符之前,并且在MULTILINE模式下也匹配换行符(摘自docs)。这就是为什么我们需要为换行符添加一个特殊字符'\ s *'。一切皆有可能: - )
>>> import re
>>> text = "foo\n \n \n \nbar\n"
>>> re.split("(?m)^\s*$\s*", text)
['foo\n', 'bar\n']
相同的正则表达式适用于Windows样式换行符。
>>> import re
>>> text = "foo\r\n \r\n \r\n \r\nbar\r\n"
>>> re.split("(?m)^\s*$\s*", text)
['foo\r\n', 'bar\r\n']
答案 2 :(得分:0)
这是你想要的吗?
>>> s = 'foo\nbar\n\nbaz'
>>> re.split('\n\s*\n',s)
['foo\nbar', 'baz']
>>> s = 'foo\nbar\n \nbaz'
>>> re.split('\n\s*\n',s)
['foo\nbar', 'baz']
>>> s = 'foo\nbar\n\t\nbaz'
>>> re.split('\n\s*\n',s)
['foo\nbar', 'baz']
答案 3 :(得分:0)
试试这个:
blank=''
with open('fu.txt') as txt:
txt=txt.read().split('\n')
for line in txt:
if line is blank: print('blank')
else: print(line)
答案 4 :(得分:-2)
你做错了是使用正则表达式。有什么问题('Some \ ntext。')。split('\ n')?