我有这个文件
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'
答案 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()
或者,您也可以通过在\n{2}
上预先设置仅设置1个标记来执行此操作:
re.match(r'(.*?)(?=\n{2})', lines, re.DOTALL).groups()
答案 3 :(得分:0)
从视觉上看,如果你想要排队直到“空白”行,这个正则表达式应该这样做 它根本不需要修饰符。
// (?:[^\S\n]*(?:\S+[^\S\n]*)+(?:\n|$))+
(?:
[^\S\n]*
(?: \S+ [^\S\n]* )+
(?: \n | $ )
)+