用正则表达式匹配空行
我有一个字符串,想根据空行把它分成几个部分。
给定一个字符串 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
编译,也没有什么不同]
5 个回答
1
试试这个:
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)
3
re库可以用来根据一个或多个空行进行分割!空行就是那种只包含空格的行,开头和结尾都是空的。特殊字符'$'表示字符串的结尾,或者在字符串结束前的换行符之前,在MULTILINE模式下,它也可以匹配换行符之前的部分(摘自文档)。所以我们需要加上一个特殊字符'\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']
19
试试这个:
re.split('\n\s*\n', s)
问题在于,"$ *^" 其实只匹配“单独在一行上的空格(如果有的话)”——并不匹配换行符本身。这就导致当一行没有内容时,分隔符是空的,这样不太合理。
这个版本还去掉了分隔符的换行符,这可能正是你想要的。否则,你会发现每个分割出来的部分前后都有换行符。
把多个连续的空行当作一个空块来处理(比如 "abc\n\n\ndef" 变成 ["abc", "", "def"])就复杂一些了……