正则表达式语法:
符号 | 意义 |
. | 表示任意字符,如果说指定了 DOTALL的标识,就表示包括新行在内的所有字符。 |
^ | 表示字符串开头。 |
$ | 表示字符串结尾 |
*,+,? | '*'表示后面可跟 0 个或多个字符,'+'表示后面可跟 1 个或多个字符,'?'表示后面可跟 0 个或多个字符 |
*?,+?,?? | 在上面的结果中只取第一个(非贪婪表达式) |
{m} | 对于前一个字符重复 m 次 |
{m,n} | 对于前一个字符重复 m 到 n 次 |
{m,n}? | 对于前一个字符重复 m 到 n 次,并且取尽可能少的情况 |
\ | 对特殊字符进行转义,或者是指定特殊序列 |
[] | 表示一个字符集 |
| | 或者,只匹配其中一个表达式 |
(...) | 匹配括号中的任意正则表达式 |
(?#...) | 注释,忽略括号内的内容 |
(?=...) | 表达式’…’之前的字符串 |
(?!...) | 后面不跟表达式’…’的字符串 |
(?<= …) | 跟在表达式’…’后面的字符串符合括号之后的正则表达式 |
(?<! …) | 括号之后的正则表达式不跟在’…’的后面 |
(?ailmsux) | (使用一个或多个字符 'a' , 'i' , 'L' , 'm' , 's' , 'u' , 'x' .)分别对应这些正则标志符号: re.A (ASCII-onlymatching), re.I (ignorecase),re.L (localedependent),re.M (multi-line), re.S (dot matchesall), |
(?:...) | 正则括号的非捕获版本. 匹配括号内的任何正则表达式,但是组里匹配的子字符串在执行了匹配或者被之后的规则引用后将不能被获取 |
(?imsx-imsx:…) | (使用零个或多个字符'i','m','s','x','-'可选) 表示设置或去除相应的标志符号: re.I (ignorecase), re.M(multi-line), re.S (dotmatches all), and re.X (verbose),for the part of the expression.(The flags are described in ModuleContents.)New in version 3.6. |
(?P<name>...) | 和用括号的正则类似,但是name可以关联匹配到的字符串,作为分组名称 |
(?P=name) | 与上面命名的用法连用,用来代指匹配F到的字符串 |
(?(id/name)yes - | 如果给定的组id或name存在,就通过 |
pattern|no-pattern) | yes-pattern去匹配,否则通过no-pattern匹配no-pattern是可选的,可以去掉. |
特殊表达式序列 | 特殊表达式序列 意义 |
\A | 只在字符串开头进行匹配 |
\b | 匹配位于开头或者结尾的空字符串 |
\B | 匹配不位于开头或者结尾的空字符串 |
\d | 匹配任意十进制数,相当于 [0 - 9] |
\D | 匹配任意非数字字符,相当于 [^0-9] |
\s | 匹配任意空白字符,相当于 [ \t\n\r\f\v] |
\S | 匹配任意非空白字符,相当于 [^ \t\n\r\f\v] |
\w | 匹配任意数字和字母,相当于 [a - zA - Z0 - 9_] |
\W | 匹配任意非数字和字母的字符,相当于 [^a-zA-Z0-9_] |
\Z | 只在字符串结尾进行匹配 |
RE使用步骤:
1、使用complie将表示正则的字符串编译为一个pattern对象
2、通过pattern对象提供一系列方法对文本进行查找匹配,获得匹配结果,一个Match对象
3、最后使用Match对象提供的属性和方法获得信息,根据需要进行操作
RE常用函数:
1、re.complie(strPattern[,flag]):对字符串编译成一个pattern对象。第二个参数flag为匹配模式,可以使用‘|’符号同时启用多种模式,如re.I|re.M
>>>p = re.compile(r'\d')
>>>p
re.compile('\\d')
flag选值:
re.I (IGNORECASE):忽略大小写
re.M (MULTILINE):多行模式,改变'^'和'$'的行为
re.S (DOTALL):点任意匹配模式,改变'.'的行为
re.L (LOCALE):使用预定字符类 \w \W \b \B \s \S取决于当前区域设定
re.U (UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性
re.X (VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。
2、re.findall(pattern,string[,flags]):以列表的形式返回能匹配的子串
>>>p = re.compile(r'\d')
>>>p.findall('whx520hhh41')
['5', '2', '0', '4', '1']
3、re.finditer(pattern,string[,flags]):返回一个顺序访问每一个匹配结果(Match对象)的迭代器
>>>p = re.compile(r'\d+')
>>>for m in p.finditer('theonly123one555h1'):
print(m.group())
123
555
1
4、re.match():从起点开始做匹配,匹配到返回match对象,否则返回None
>>>p = re.compile(r'\d+')
>>>m = p.match('www1123')
>>>m
None
>>>m = p.match('1www1123')
>>>m
<_sre.SRE_Match object; span=(0, 1), match='1'>
re.match对象所具有的方法
group():获得一个或者多个分组匹配的字符串,当获得整个匹配的子串时,直接使用group或者group(0)
star()t:获取分组匹配的子串在整个字符串中的开始位置,参数默认为0
end():获取分组匹配的子串在整个字符串中的结束位置,参数默认为0
span():返回的结构技术(start(group),end(group))
5、re.search():扫描整个字符串返回第一个匹配到的元素并结束,匹配不到返回None
>>>p = re.compile(r'\d')
>>>m = p.search('aaaad2xxxx333')
>>>m
<_sre.SRE_Match object; span=(5, 6), match='2'>
6、re.sub和re.subn:替换匹配成功的字串,sub不仅仅可以是字符串,也可以是函数。subn函数返回元组。
>>>p = re.compile(r'\d+')
>>>ret = p.sub('*','ab12cd34ef56')
>>>ret
'ab*cd*ef*'
>>>ret = p.subn('*','ab12cd34ef56')
>>>ret
('ab*cd*ef*', 3)
7、re.split(pattern.string,maxsplit=0):通过正则表达式将字符串分离。如果用括号将正则表达式括起来,那么匹配的字符串也会被列入到list中返回。maxsplit是分离的次数,maxsplit=1分离一次,默认为0,不限制次数。
>>>p = re.compile(r'\d+')
>>>sp = p.split('a1b2c3d4ef56g8')
>>>sp
['a', 'b', 'c', 'd', 'ef', 'g', '']
其他:
控制贪心:
•*? 重复任意次,但尽可能少重复
•+? 重复1次或更多次,但尽可能少重复
•?? 重复0次或1次,但尽可能少重复
•{n,}? 重复n次以上,但尽可能少重复
小案例:
手机号,电话号:
手机号码傻瓜版: ^1\d{10}$
电话号码必备区号版:\d{3}-\d{8}|\d{4}-\d{7}匹配形式如 0511-4405222 或 021-87888822
邮箱:
电子邮件的验证:/(\w+@(\w+\.)+\w{2,3})?/
验证Email地址:^\w+[-+.]\w+)*@\w+([-.]\w+)*\. \w+([-.]\w+)*$
验证Email地址:/.+@.+\.[a-z]+/
身份证:
身份证号: ^(\d{15}|\d{17}(\d|X))$
-匹配腾讯QQ号:[1-9][0-9]{4,}腾讯QQ号从10000开始
-只能输入汉字:^[\u4e00-\u9fa5]{1,8}$
-只能输入由数字和26个英文字母组成的字符串:“^[A-Za-z0-9]+ $”
-验证用户密码:“^[a-zA-Z]\w{7,17}$”正确格式为:以字母开头,长度在8-18之间, 只能包含字符、数字和下划线。