关于贪婪和非贪婪,贪婪匹配的意思是,在同一个匹配项中,尽量匹配更多所搜索的字符,非贪婪则相反。正则匹配的默认模式是贪婪模式,当?号跟在如下限制符后面时,使用非贪婪模式(*,+,?,{n},{n,},{n,m})
如正则表达式 \S+c 匹配字符串aaaacaaaaaaac的结果是aaaacaaaaaaac,而\S+?c则会优先匹配aaaac
有时候在使用正则表达式做匹配的时候,我们希望匹配一个字符串,这个字符串的前面或后面需要是特定的内容,但我们又不想要前面或后面的这个特定的内容,这时候就需要零宽断言的帮助了。所谓零宽断言,简单来说就是匹配一个位置,这个位置满足某个正则,但是不纳入匹配结果的,所以叫“零宽”,而且这个位置的前面或后面需要满足某种正则。
零宽断言:正向和反向两类,分别用等号(=)和感叹号(!)表示,每类又分为:前视和后视,分别表示位置前后,表达式如果存在小于号(<),表示后视,否则即为前视;
正向前视断言:语法:(?=exp),它断言此位置的后面能匹配表达式exp,但不包含此位置;
如:a(?=\d),返回匹配字符串中以数字为结尾的a字符。
正向后视断言:语法:(?<=exp),它断言此位置的前面能匹配表达式exp;
如:(?<=\d)a,返回匹配字符串中以数字为开头的a字符。
反向前视断言:语法:(?!exp),它断言此位置的后面不能匹配表达式exp;
如:a(?!\d),返回不匹配字符串中以数字结尾的a字符。
反向后视断言:语法:(? 如:a(?
通过使用 (?iLmsux) 系列选项,用户可以直接在正则表达式里面指定一个或者多个标记,而不是通过 compile()或者其他 re 模块函数。
1、(?i):表示 re.I/IGNORECASE,忽略大小写
2、(?L): LOCALE, 字符集本地化。这个功能是为了支持多语言版本的字符集使用环境的,比如在转义符\w,在英文环境下,它代表[a-zA-Z0-9_],即所以英文字符和数字。如果在一个法语环境下使用,缺省设置下,不能匹配"é" 或 “ç”。加上这L选项和就可以匹配了。不过这个对于中文环境似乎没有什么用,它仍然不能匹配中文字符
3、(?m):表示 re.M/MULTILINE,实现多行混合,data 数据多行
4、(?s):表示符号 . 可以代表任意符号(正常情况符号 . 表示除 \n 之外的任意符号);
5、(?u): UNICODE,使用 \w, \W, \b, \B 这些元字符时将按照 UNICODE 定义的属性;
6、(?x):表示允许用户通过抑制在正则表达式中使用空白符(除了在字符类中或者反斜线转义中)来创建更易读的正则表达式,正则表达式多行;
当我们使用正则表达式的时候,我们经常会使用()把某个部分括起来,称为一个子模式。子模式有Capturing和Non-Capturing两种情况。捕获的字符串会被缓存起来以供后续使用,具体表现为每个()中的表达式所匹配到的内容在进行正则匹配的过程中,都会被缓存下来。
var testReg=/(a+)(b*)c/;
testReg.test('aaaabbbccc');//输出true
console.log(RegExp.$1);//输出aaaa
console.log(RegExp.$2);//输出bbb
但是,如果在子分组中加入?:之后,分组依然成立,但是不会被缓存下来
var testReg=/(a+)(?:b*)c/;
testReg.test('aaaabbbccc');//输出true
console.log(RegExp.$1);//输出aaaa
console.log(RegExp.$2);//输出""
当用“()”定义了一个正则表达式分组后,正则引擎就会把匹配的组按照顺序进行编号,然后存 入缓存中。这样我们就可以在后面对已经匹配过的内容进行引用,这就叫后向引用。
1、通过索引引用
\数字 \1表示引用第一个分组,\2引用第二个分组,以此类推,\n引用第n个组,而\0则表示引用整个被匹配的正则表达式本身。
交换字符串的位置
import re
s = 'abc.xyz' # 交换.号两边的字符串
res = re.sub(r'(.*)\.(.*)', r'\2.\1', s)
print res
>>>xyz.abc
命名分组就是给具体有默认分组编号的组另外再起一个别名,方便以后的引用。 命令分组的语法格式如下: (?P
语法格式中的字符P必须是大写的“P”,name是一个合法的标识符,表示分组的别名。
s = "ip='230.192.168.78',version='1.0.0'"
res = re.search(r"ip='(?P
print res.group('ip')#通过命名分组引用分组
使用命名分组后,可以再使用?P = name调用命名分组,即在一个字符串中,匹配由(?P****)命名的分组
(?#****)表示注释,所有内容都被忽略