正则表达式匹配空行前面和后面的行?

时间:2014-02-12 03:19:31

标签: python regex

我有一个类似

的文件
  

这是一条从上面继续的线.......

     

这是我想要匹配的行......

     

这是我想要匹配的另一条线....

     

这是我想要匹配的另一条线....

     

这是一些常规文字。 Blah ......
  继续上面的常规文本......

我想在空白行之前和之后“紧凑”行。喜欢这个

  

这是我要匹配的行.......   这是我想要匹配的另一条线。
  这是我想要匹配的另一条线....

     

这是一些常规文字。 Blah ......
  继续上面的常规文本

我尝试使用

匹配换行符之前和之后的行

re.findall(r'\n\n[\w ]+\n\n')

但失败了。有什么建议吗?

3 个答案:

答案 0 :(得分:4)

PCRE在Python中不可用,因此您必须使用以下内容:

/(?=\r?\n|\x0b|\f|\r|\x85)(\r?\n|\x0b|\f|\r|\x85)(.+(\r?\n|\x0b|\f|\r|\x85))(?=\r?\n|\x0b|\f|\r|\x85)/g

Python现场演示:http://regex101.com/r/xL8bF1(有关复杂的换行符,请参阅pcrepattern specification

PCRE正则表达式应该做你想要的:

/(?=\R)\R(.+\R)(?=\R)/g

PCRE(PHP)现场演示:http://regex101.com/r/aO8yA7

PS:在regex101上使用可视化空白功能,以便更好地理解替换结果。

答案 1 :(得分:1)

在@ Fleshgrinder的优秀方法基础上进行所需的替换:

re.sub(r'(?=\n)\n(.+)\n(?=\n)', r'\1\n', inputString)

如果您还需要使用包含\r\n行结尾的输入:

re.sub(r'(?=\r?\n)\r?\n(.+)(\r?\n)(?=\r?\n)', r'\1\2', inputString)

假设Unix系统和名为in.txt的输入文件,您可以从命令行测试它,如下所示:

python -c \
  "import re,sys; print re.sub(r'(?=\n)\n(.+)\n(?=\n)', r'\1\n', sys.argv[1])" \
  "$(<in.txt)"

答案 2 :(得分:0)

使用Perl的简单解决方案(假设有问题的文件名为“in.txt”) -

perl -e 'undef $/; while ($file=<>) {$file=~s/\n\n(.*)(\n\n)/\n$1\n/g; print $file}' in.txt

基本上,在Perl中将整个文件作为单个字符串读入,然后将Perl中的替换函数应用于整个字符串。

(注意 - 我假设这是一个Unix系统。你可能想根据@Fleshgrinder的回答为Windows机器添加额外的可选检查回车。)