获取行直到^ $

时间:2013-10-16 18:44:38

标签: python regex match

我有这个文件

line 1
line 2
line 3

line 4    
line 5
line 6

我如何从line 1转到line 3

我试过了:

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

但我明白了:

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

4 个答案:

答案 0 :(得分:2)

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

>>> print re.match(r'(.*)^$', lines, re.MULTILINE | re.DOTALL).groups()
('\nline 1\nline 2\nline 3\n',)

答案 1 :(得分:2)

我不会使用正则表达式。它可以更清晰(IMO)迭代线并停在空白处,或者只使用split作为分隔符'\n\n'整个事件。我更喜欢使用复杂的正则表达式,因为当您在六个月后重新使用此代码时,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']

答案 2 :(得分:1)

首先,除了re.DOTALL之外,您还需要使用re.MULTILINE标记,以便.也匹配换行符。 re.MULTILINE只会在每行的末尾匹配^$

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

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

Demo

或者,您也可以通过在\n{2}上预先设置仅设置1个标记来执行此操作:

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

Demo

答案 3 :(得分:0)

从视觉上看,如果你想要排队直到“空白”行,这个正则表达式应该这样做 它根本不需要修饰符。

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

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