/…/ 代表一个模式的开始和结束
^ 匹配字符串的开始
$ 匹配字符串的结束
(x) 匹配x保存x在名为$1...$9的变量中
x|y 匹配x或y
[xyz] 字符集(character set),匹配这个集合中的任一一个字符(或元字符)
[^xyz] 不匹配这个集合中的任何一个字符
[\b] 匹配一个退格符
\b 匹配一个单词的边界
\B 匹配一个单词的非边界
\cX 这儿,X是一个控制符,/\cM/匹配Ctrl-M
\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个制表符
\v 匹配一个重直制表符
\s 任何空白字符
\S 任何非空白字符
\d 匹配一个数字字符,等价于[0-9]
\D 除了数字之外的任何字符,等价于[^0-9]
\w 匹配一个数字、下划线或字母字符,等价于[A-Za-z0-9_]
\W 匹配一个不可以组成单词的字符,如[\W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。
. 除了换行符之外的任意字符
{n} 匹配前一项n次
{n,} 匹配前一项n次,或者多次
{n,m} 匹配前一项至少n次,但是不能超过m次
* 匹配前一项0次或多次,等价于{0,}
+ 匹配前一项1次或多次,等价于{1,}
? 匹配前一项0次或1次,也就是说前一项是可选的,等价于{0,1}
"^\\d+$" //非负整数(正整数 + 0)
"^[0-9]*[1-9][0-9]*$" //正整数
"^((-\\d+)|(0+))$" //非正整数(负整数 + 0)
"^-[0-9]*[1-9][0-9]*$" //负整数
"^-?\\d+$" //整数
"^\\d+(\\.\\d+)?$" //非负浮点数(正浮点数 + 0)
"^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$" //正浮点数
"^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$" //非正浮点数(负浮点数 + 0)
"^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$" //负浮点数
"^(-?\\d+)(\\.\\d+)?$" //浮点数
"^[A-Za-z]+$" //由26个英文字母组成的字符串
"^[A-Z]+$" //由26个英文字母的大写组成的字符串
"^[a-z]+$" //由26个英文字母的小写组成的字符串
"^[A-Za-z0-9]+$" //由数字和26个英文字母组成的字符串
"^\\w+$" //由数字、26个英文字母或者下划线组成的字符串
"^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$" //email地址
"^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$" //url
字符?
意义:匹配?前面的字符0次或1次。
例如:/e?le?/匹配"angel"中的'el'和"angle."中的'le'。
var reg=/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/;
//(?![0-9]+$) 不能是纯数字 , 限制 ,不占位
// ?! 开头不能只是拼接数字结尾
// 开始位置开始算起 , $是一个结尾位置
//(?![0-9]+$)就是修饰不能是纯数字
// 断言此位置后,字符串结尾之前,所有的字符不能全部由数字([^a-zA-Z]表示非英文字母,结合下文,这里匹配数字)组成。
// [0-9]+ 是纯数字
// ?! 不能以后边的这些开始。
//(?![a-zA-Z]+$) 不能是纯字母 , 限制,不占位
//[0-9A-Za-z]{6,20} 6-20位的字符
var reg=/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
2.查找子串在父串中的位置
>>> re.search(r'shuage','i love shuage!!')
<_sre.SRE_Match object; span=(7, 13), match='shuage'>
2.查找父串中所有的子串,返回一个数组
>>> re.findall(r'[a-z]','ShuaiGe')
['h', 'u', 'a', 'i', 'e']
3.综合整理
. 点(.)代表任意字符
\. 匹配点(.)
\d 配置所有的数字
[] 匹配[]里面任何一个字符
{} 前边要匹配的字符要显示多少次
| 逻辑或
() 表示分组
^ 以字符串开头
$ 以字符串结尾
\ 把元字符变为普通字符,把普通字符变为特殊字符例\d
\数字 例如\1表示第一组(小括号里面的正则)再重复一次,\2表示第二组再重复一次
举例: (shuage)\1 == shuageshuage (shuage)(hao)\2 == shuagehaohao
如果以0开头,或者3个数字的长度,那么不会被用于引用对应的子组,而是用于匹配八进制数字所表示的ASCII码值对应的字符
[.] 匹配.
[\] 会报错,\ 在[]中表示转意符
[\n] 表示回车
[^a-z] 表示除了a-z以外的都匹配,^表示取反
[a-z^] 表示^本身
* 表示匹配前面的子表达式零次或多次,等价于{0,}
+ 表示匹配前面的子表达式一次或多次,等价于{1,}
? 表示匹配前面的子表达式零次或1次,等价于{0,1}
正则默认是贪婪模式,启用非贪婪模式方法:在重复后面加上?就可以了。
\b 表示匹配一个单词的边界,被定义为Unidcode的字母数字或者下横线字符也被认为是一个单词的一部分 .()!属于单词的边界
\B 表示匹配非单词边界,其实就是跟上边的相反
\D 表示匹配跟\d相反的字符
\s 表示匹配空白字符,例如 \t(制表符)\n(空格)\r(回车)\f(换页)\v(表示垂直的tab键)
\S 表示与\s相反
\w 表示匹配单词字符
\W 表示与\w相反
4.正则说明
[a-z] 匹配所有的小写字母
[0-9] 匹配所有的数字
3{3} 3个3 大括号前边这个字符是多少个
3{3,10} 3-10个3 大括号前边这个字符是多少个
5.案例
匹配(0-255):[01]\d\d|2[0-4]\d|25[0-5] 按照每位来匹配
匹配ip :(([01]{0,1}\d{0,1}\d|2[0-4]{0,1}\d{0,1}|25[0-5]{0,1})\.){3}([01]{0,1}\d{0,1}\d|2[0-4]{0,1}\d{0,1}|25[0-5]{0,1})
解释:
([01]{0,1}\d{0,1}\d|2[0-4]{0,1}\d{0,1}|25[0-5]{0,1}) : ()小括号里面的是一个完整部分,匹配(0-255)
(([01]{0,1}\d{0,1}\d|2[0-4]{0,1}\d{0,1}|25[0-5]{0,1})\.) : 最外边小括号是一个完整部分,匹配(0-255).
(([01]{0,1}\d{0,1}\d|2[0-4]{0,1}\d{0,1}|25[0-5]{0,1})\.){3} : 表示前边的小括号执行3次
正则默认贪婪模式
>>> s = '<html><title> i love shuage </title></html>'
>>> re.search(r'<.+>',s)
<_sre.SRE_Match object; span=(0, 43), match='<html><title> i love shuage </title></html>'>
启用非贪婪模式
>>> s = '<html><title> i love shuage </title></html>'
>>> re.search(r'<.+?>',s)
<_sre.SRE_Match object; span=(0, 6), match='<html>'>
6.编译正则表达式 -- 成模块级别 --有6种编译模式
>>> p = re.compile(r'[A-Z]')
>>> p.search('I love ShuaGe')
<_sre.SRE_Match object; span=(0, 1), match='I'>
>>> p.findall('I love ShuaGe')
['I', 'S', 'G']
网友评论