1

我有这个文件

line 1
line 2
line 3

line 4    
line 5
line 6

我怎么能从line 1line 3

我试过了:

print re.match(r'(.*)^$', lines, re.MULTILINE).groups()

但我得到:

AttributeError: 'NoneType' object has no attribute 'groups'
4

4 回答 4

2

我不会为此使用正则表达式。遍历行并在空白处停止或仅split将整个内容'\n\n'用作定界符要干净得多(IMO)。与使用复杂的正则表达式相比,我更喜欢它,因为split当您在六个月后返回此代码时,阅读起来会更加直观。

s = '''line 1
line 2
line 3

line 4
line 5
line 6'''

lines = []
for line in s.split('\n'): # just for line in file if you're reading from a file
    if line:
        lines.append(line)
    else: # Empty line: stop looking
        break

print(lines) # >>> ['line 1', 'line 2', 'line 3']

print(s.split('\n\n'))  # >>> ['line 1\nline 2\nline 3', 'line 4\nline 5\nline 6']
于 2013-10-16T19:42:16.897 回答
2

添加re.DOTALL标志以使点也匹配换行符:

>>> print re.match(r'(.*)^$', lines, re.MULTILINE | re.DOTALL).groups()
('\nline 1\nline 2\nline 3\n',)
于 2013-10-16T18:49:14.473 回答
1

首先,除了 ,您还需要使用re.DOTALLflagre.MULTILINE.匹配换行符。re.MULTILINE只会在每行的末尾做^和匹配。$

设置该标志后,您可以在此处使用前瞻:

re.match(r'(.*?)(?=^$)', lines, re.DOTALL | re.MULTILINE).groups()

演示

或者,您也可以通过前瞻来仅设置 1 个标志来执行此操作\n{2}

re.match(r'(.*?)(?=\n{2})', lines, re.DOTALL).groups()

演示

于 2013-10-16T18:49:01.107 回答
0

从视觉上看,如果你想在“空白”行之前排成一行,这个正则表达式应该可以做到。
它根本不需要修饰符。

 //  (?:[^\S\n]*(?:\S+[^\S\n]*)+(?:\n|$))+

 (?:
      [^\S\n]* 
      (?: \S+ [^\S\n]* )+
      (?: \n | $ )
 )+
于 2013-10-16T19:35:00.727 回答