赞
踩
写代码时候,不管是爬虫,还是获取某些特定的资源,我们需要写正则表达式。 因为不常用,有些语法生疏。有时明明觉得自己的语法可以,可就是不行。
正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。 不管是python还是shell,都可以写正则。
正则表达式基本语法
头和尾
他们的作用是分别指出一个字符串的开始和结束。例子如下:
"^The":表示所有以"The"开始的字符串("There","The cat"等);
"of despair":表示开始和结尾都是"abc"的字符串——呵呵,只有"abc"自己了;
"notice":表示任何包含"notice"的字符串。
模糊匹配
'.'表示匹配任意的一个字符,相当于一个占位符号。
'',“没有或更多”
'+',“一次或更多”
'?',“没有或一次”
下面是几个例子:
"ab":表示一个字符串有一个a后面跟着零个或若干个b。("a", "ab", "abbb",……);
"ab+":表示一个字符串有一个a后面跟着至少一个b或者更多;
"ab?":表示一个字符串有一个a后面跟着零个或者一个b;
"a?b+$":表示在字符串的末尾有零个或一个a跟着一个或几个b。
分组和范围
() 是为了提取匹配的字符串。表达式中有几个()就有几个相应的匹配字符串。
[]是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字。[\s]表示空格或者号。
{}一般用来表示匹配的长度,比如 \s{3} 表示匹配三个空格,\s{1,3}表示匹配一到三个空格。
你也可以使用范围,用大括号括起,用以表示重复次数的范围。
"ab{2}":表示一个字符串有一个a跟着2个b("abb");
"ab{2,}":表示一个字符串有一个a跟着至少2个b;
"ab{3,5}":表示一个字符串有一个a跟着3到5个b。
区别:
圆括号()是组,主要应用在限制多选结构的范围/分组/捕获文本/环视/特殊模式处理
(abc|bcd|cde),表示这一段是abc、bcd、cde三者之一均可,顺序也必须一致。
方括号是单个匹配,字符集/排除字符集/命名字符集
示例:
1、[0-3],表示找到这一个位置上的字符只能是0到3这四个数字,与(abc|bcd|cde)的作用比较类似,但圆括号可以匹配多个连续的字符,而一对方括号只能匹配单个字符
2、[^0-3],表示找到这一个位置上的字符只能是除了0到3之外的所有字符
()内的内容表示的是一个子表达式,()本身不匹配任何东西,也不限制匹配任何东西,只是把括号内的内容作为同一个表达式来处理
[]表示匹配的字符在[]中,并且只能出现一次,并且特殊字符写在[]会被当成普通字符来匹配
选择,'¦',表示“或”操作
"hi¦hello":表示一个字符串里有"hi"或者"hello";
"(b¦cd)ef":表示"bef"或"cdef";
"(a¦b)*c":表示一串"a""b"混合的字符串后面跟一个"c";
为了逐字表达,你必须在"^.$()¦*+?{"这些字符前加上转移字符''。
请注意在方括号中,不需要转义字符。
元字符及其在正则表达式上下文中的行为:
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。也匹配 '\n' 或 '\r' 之前的位置
{n} n 是一个非负整数,匹配确定的n 次。
{n,} n 是一个非负整数,至少匹配n 次。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格。
? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。
. 匹配除 “\n” 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
(pattern) 匹配pattern 并获取这一匹配。
(?:pattern) 匹配pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。
(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。
(?!pattern) 负向预查,与(?=pattern)作用相反
x|y 匹配 x 或 y。
[xyz] 字符集合。
[^xyz] 负值字符集合。
[a-z] 字符范围,匹配指定范围内的任意字符。
[^a-z] 负值字符范围,匹配任何不在指定范围内的任意字符。
\b 匹配一个单词边界,也就是指单词和空格间的位置。
\B 匹配非单词边界。
\cx 匹配由x指明的控制字符。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。
\num 匹配 num,其中num是一个正整数。对所获取的匹配的引用。
太多了,大概记住就行了。
贪婪与非贪婪
属于贪婪模式的量词,也叫做匹配优先量词,包括:
“{m,n}”、“{m,}”、“?”、“”和“+”。
在一些使用NFA引擎的语言中,在匹配优先量词后加上“?”,即变成属于非贪婪模式的量词,也叫做忽略优先量词,包括:
“{m,n}?”、“{m,}?”、“??”、“?”和“+?”。
意思是说,跟人性一样,本性是贪婪的。但是,经过自己的反问,变得不贪婪了。
以下一些例子,来阐明这个
101000011000
1.* 结果:all, 贪婪的,所有匹配
1.? 结果:10,10,11, 非贪婪(最多一个,达到为止)
1.+ 结果:all, 贪婪的,所有匹配
1.*? 结果:非1 1 1 1 , 非贪婪的(点后面0个)
1.+? 结果:10,10,11,非贪婪的(点后面一个)
1.?+ no(不合法)
1.?* no (不合法)
1.*+ no(不合法)
1.+* no (不合法)
如果对自己写的表达式没有信心,可以找个工具检测以下。
网上很多工具,如:
检验: http://tool.oschina.net/regex/#
来检验一下,比如我们要匹配email地址
E-mail地址:我写的,\w+@\w+.\w+
虽然不是特别精确,但是基本功能能够满足了。
手机号码:^((\d2,3)|(\d{3}-))?13\d{9}$
[0-9]{11}
1[0-9]{10}
\d{11}
35、IP:
my: (\d+){1,3}.(\d+){1,3}.(\d+){1,3}.(\d+){1,3}
正则表达式也会有精度的。一般我们要把其特征点找出来,后面的就好办了。
更多精彩,请关注微信公众号:python爱好部落
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。