Python 正则表达式里的单行s和多行m模式
来源:互联网 发布:java三大程序结构 编辑:程序博客网 时间:2024/05/18 00:27
Python 的re模块内置函数几乎都有一个flags参数,以位运算的方式将多个标志位相加。其中有两个模式:单行(re.DOTALL, 或者re.S)和多行(re.MULTILINE, 或者re.M)模式。它们初看上去不好理解,但是有时又会非常有用。这两个模式在PHP和JavaScripts里都有。
单行模式 re.DOTALL
在单行模式里,文本被强制当作单行来匹配,什么样的文本不会被当作单行?就是里面包含有换行符的文本,比如:
This is the first line.\nThis is the second line.\nThis is the third line.
正则表达式中,点号(.)能匹配除换行符外的所有字符,当搜索碰到换行符时,停止匹配。现在我们希望能匹配出包括换行符在内的整个字符串。例如:
>>> a = 'This is the first line.\nThis is the second line.\nThis is the third line.'>>> print aThis is the first line.This is the second line.This is the third line.>>> import re>>> p = re.match(r'This.*line.' ,a)>>> p.group(0)'This is the first line.'>>>
在上面的例子里,即使是默认贪婪(greedy)的匹配,仍然在第一行的结尾初停止了匹配,而在单行模式下,换行符被当作普通字符,被点号(.)匹配:
>>> q = re.match(r'This.*line.', a, flags=re.DOTALL)>>> q.group(0)'This is the first line.\nThis is the second line.\nThis is the third line.'
点号(.)匹配了包括换行符在内的所有字符。所以,更本质的说法是
单行模式改变了点号(.)的匹配行为
多行模式 re.MULTILINE
在多行模式里,文本被强制当作多行来匹配。正如上面单行模式里说的,默认情况下,一个包含换行符的字符串总是被当作多行处理。但是行首符^和行尾符$仅仅匹配整个字符串的起始和结尾。这个时候,包含换行符的字符串又好像被当作一个单行处理。
在下面的例子里,我们希望能将三句话分别匹配出来。用re.findall( )显示所有的匹配项
>>> a = 'This is the first line.\nThis is the second line.\nThis is the third line.'>>> print aThis is the first line.This is the second line.This is the third line.>>> import re>>> re.findall(r'^This.*line.$', a)[]>>>
默认点号不匹配换行符,我们需要设置re.DOTALL。
>>> re.findall(r'^This.*line.$', a, flags=re.DOTALL)['This is the first line.\nThis is the second line.\nThis is the third line.']>>>
匹配出了整句话,因为默认是贪婪模式,用问号切换成非贪婪模式:
>>> re.findall(r'^This.*?line.$', a, flags=re.DOTALL)['This is the first line.\nThis is the second line.\nThis is the third line.']
仍然是整句话,这是因为^和$只匹配整个字符串的起始和结束。在多行模式下,^除了匹配整个字符串的起始位置,还匹配换行符后面的位置;$除了匹配整个字符串的结束位置,还匹配换行符前面的位置.
re.findall(r'^This.*?line.$', a, flags=re.DOTALL+re.MULTILINE)['This is the first line.', 'This is the second line.', 'This is the third line.']>>>
更本质的说法是
多行模式改变了^和$的匹配行为
因为一个文件里经常有很多换行符,当需要在一个文件里跨行匹配时,单行和多行模式尤其有用。
原文链接:http://www.lfhacks.com/tech/python-re-single-multiline
- Python 正则表达式里的单行s和多行m模式
- Python 正则表达式里的单行s和多行m模式
- 正则表达式的多行模式与单行模式
- 正则表达式的多行模式与单行模式
- 正则表达式中的单行和多行
- Python 正则表达式验证注释(含单行和多行)
- javascipt 正则表达式 匹配 单行和多行注释
- python里使用正则表达式的重复模式
- python里使用正则表达式的非贪婪模式
- python里使用正则表达式的嵌套可选模式
- python里使用正则表达式的非捕获模式
- python里使用正则表达式的ASCII模式
- python里使用正则表达式的句号和星号
- Python 正则表达式验证单行注释
- 正则的多行模式 m
- Python正则表达式的贪婪模式和非贪婪模式
- 正则表达式:(?m)(\\S+)\\s+((\\S+)\\s+(\\S+))$
- 正则单行和多行处理
- ANSJ调用word2vec model文件
- IOS面试------多线程
- 结构体应用(1)
- 异步复位同步释放
- 音乐播放器
- Python 正则表达式里的单行s和多行m模式
- JQuery入门$.ajax
- C++的重载、隐藏和重写
- Swift开发 基本运算符
- java之 ------ 类反射【详解】
- JAVA学习笔记之数据类型
- 对象的方法,对话框的使用
- 解bug的一些感悟
- 2015/9/8