1.3.7.2 多行输入
有两个标志会影响如何完成多行输入中的搜索:MULTILINE和DOTALL。MULTILINE标志控制模式匹配代码如何对包含换行符的文本处理锚定指令。打开多行模式时,对^和$的锚定规则除了应用于整个字符串之外,还会在各行的开头和末尾应用。
import re
text = 'This is some text -- with punctuation .\nA second line.'
pattern = r'(^\w+)|(\w+\S*$)'
single_line = re.compile(pattern)
multiline = re.compile(pattern,re.MULTILINE)
print('Text:\n {!r}'.format(text))
print('Pattern:\n {}'.format(pattern))
print('Single Line:')
for match in single_line.findall(text):
print(' {!r}'.format(match))
print('Multline :')
for match in multiline.findall(text):
print(' {!r}'.format(match))
这个例子中的模式可以匹配输入的第一个单词或最后一个单词。他会匹配字符串末尾的line.,尽管这里没有换行符。
运行结果:
Text:
‘This is some text – with punctuation .\nA second line.’
Pattern:
(^\w+)|(\w+\S*$)
Single Line:
(‘This’, ‘’)
(’’, ‘line.’)
Multline :
(‘This’, ‘’)
(‘A’, ‘’)
(’’, ‘line.’)
DOTALL是另一个与多行文本有关的标志。正常情况下,点字符(.)可以匹配输入文本中除换行符外的所有字符。这个标志允许点字符还可以匹配换行符。
import re
text = 'This is some text -- with punctuation.\nA second line.'
pattern = r'.+'
no_newlines = re.compile(pattern)
dotall = re.compile(pattern,re.DOTALL)
print('Text:\n {!r}'.format(text))
print('Pattern:\n {}'.format(pattern))
print('No newlines:')
for match in no_newlines.findall(text):
print(' {!r}'.format(match))
print('Dotall :')
for match in dotall.findall(text):
print(' {!r}'.format(match))
如果没有这个标志,输入文本的各行会单独匹配模式。增加了这个标志则会消费整个字符串。
运行结果:
Text:
‘This is some text – with punctuation.\nA second line.’
Pattern:
.+
No newlines:
‘This is some text – with punctuation.’
‘A second line.’
Dotall :
‘This is some text – with punctuation.\nA second line.’