Python之正则表达式
-
正则表达式
-
什么是正则表达式?
-
正则表达是一套匹配字符串的通用规则,很多开发语言中都有。
-
-
为什么要用正则表达式?
-
检测一个字符串是否合法。在用户输入一个内容的时候,应该对用户输入的内容做检测,这样才能规避因用户的错误或恶意输入,对程序和服务器造成的资源浪费。多用于在Web项目开发时,用于表单验证。
-
高效的内容匹配。从一个大文件当中快速的找到所有符合规则的内容。多用于爬虫的日志分析。
-
-
正则表达式怎么用?
正则表达式永远都是从左到右依据规则进行匹配的,正则表达式没有逻辑,只认规则!有逻辑的永远是正则表达式的设计者!
-
字符组
字符组是整个正则表达式中描述最细腻的方式,可以精准的匹配到任何内容。
-
[]
:一个中括号内放入需要匹配的的字符,只要被匹配的字符串内单个字符位置含有中括号里的ASCII字符,就算匹配成功。中括号内可以写一个、多个、一个范围或者多个范围的字符,字符的范围需根据ASCII码值中从小到大,不能从大到小。[Python] # 匹配P,y,t,h,o,n这6个字母,只匹配一个字符位 [a-z] # 匹配a到z所有的字母,由于根据ASCII码进行匹配,因此范围需要ACSII码从小到大,不能z-a [A-z] # 匹配A到Z所有的字母 [0-9] # 匹配0到9所有的数字 [0-9a-zA-Z] # 匹配所有大小写字母与数字,可以写多个范围
-
-
非字符组
-
[^]
:一个中括号,第一位是^
,表示非字符组。[^Python] # 只要匹配内容中不是P,y,t,h,o,n这6个字母,那个字节位就算匹配成功
-
-
元字符
在正则表达式中表示匹配的内容符号(字符组、
\d
、\w
、\s
等)都是元字符。表示能匹配那些内容,一个元字符只能表示一个字符位置上的字符。
-
\d
:表示匹配一位任意数字字符,等同于[0-9]
。d表示digit。
-
\w
:表示匹配一位任意数字字符、字母和下划线,等同于[0-9a-zA-Z_]
。w表示word。
-
\s
:表示匹配一位任意空字符(空格: ,制表符:\t
,回车:\n
)。
-
\D
:表示匹配一位任意非数字字符。
-
\w
:表示匹配一位任意非数字、字母和下划线字符。
-
\S
:表示匹配一位任意非空白字符。
-
\b
:表示以一个单词为边界匹配任意数字、字母和下划线结尾的字符。
-
.
:表示匹配一位除换行符以外的任意字符。但可以通过设置使其能够匹配换行符。注意,如果匹配的字符串中含有.
比如:www.google.com,那么需要在规则的.
之前加上\
进行转义:\.
,否则.
所占的字符位就会匹配除换行符以外的任意字符。
-
[\d\D]
、[\w\W]
、[\d\D]
:表示匹配一位任意字符。
-
^
:匹配字符串的开始。注意:^
只能出现在开始的位置,且只从字符串的开始位置进行匹配,进行匹配时,空白字符由于看到不,经常会被忽略,所以要格外注意,空白字符也要算上。
-
$
:匹配字符串的结尾。注意:$
只能出现在结束的位置,且只从字符串的结束位置进行匹配,进行匹配时,空白字符由于看到不,经常会被忽略,所以要格外注意,空白字符也要算上。
-
^
和$
组合使用:约束了在^
和&
之间的所有字符和字符位,被匹配字符串必须和^ &
之间的字符一模一样才算匹配成功。主要用于判断用户输入内容的合法性检查。
-
|
:表示“或”,匹配|
左右两边的内容,但是要注意,由于正则表达式是从左往右进行的规则匹配,如果左边匹配成功了,就不会再匹配右边,因此左右两边如果有重叠内容,一定要把更长的内容写在左边。
-
():表示分组,用于约束某一个元字符的作用范围。
www\.baidu\.com|www\.google\.com # 可以写成 www\.(baidu|google)\.com # 表示|只在括号内生效
-
-
量词
表示一个元字符匹配多少次。单独使用不生效,必须跟在一个元字符的后面,并且只能约束前面的一个元字符。
-
{n}
:表示匹配n次。# 匹配手机号,要求第1位数字必须以1开头,第2位数字是3到9,必须只能是11位的数字 1[3-9]\d{9} # 判断用户输入的手机号是否合法 ^1[3-9]\d{9}$ # 严格约束^和$之间的内容
-
{n,}
:表示至少匹配n次。
-
{n,m}
:表示至少匹配n次,至多匹配m次。
-
?
:表示匹配0次或1次。等同于:{0,1}
。也就是说可以表示某一个位置上的值可出现也可不出现。
-
+
:表示1次或多次。等同于:{1,}
# 匹配一个任意整数: \d+ # 匹配一个任意浮点数: \d+\.\d+
-
*
:表示0次或多次。等同于:{0,}
,也就是所有。# 匹配一个任意整数或浮点数 \d+(\.\d+)?
-
-
贪婪匹配
贪婪匹配的现象表现在量词允许的范围内,会尽量多的匹配内容。例如:
{n,m}
正则表达式会匹配m次。# 匹配一串数字,当遇到9的时候停止 \d{1,}9 17892190915509876554 # 匹配结果:17892190915509 # 为什么匹配到最后一个9才停止呢?其中除了涉及到贪婪匹配,还涉及到了回溯算法。计算机是这样读正则表达式的:看到 \d 就知道要匹配一个任意数字字符,看到 {} 里面有个 1,先读 \d 后面的 1 位,然后又看了个逗号,并且逗号后面什么也没有,就开始一直匹配数字直到没有数字为止,结果又看到了个 9 ,此时开始从数字的末尾往回走找 9 ,找到 9 后匹配完毕,因此找到的就是最后一个 9 ,这,就是回溯算法。
.*x
:表示匹配任意字符、任意次数,遇到最后一个x才下来。
-
非贪婪(惰性)匹配
惰性匹配实在量词后面加上一个
?
,表示在量词范围内进行最少匹配。例如:{n,m}?
正则表达式会匹配n次。\d{1,}?9 17892190915509876554 ''' 匹配结果: 1789 219 09 15509 '''
.*?x
:表示匹配任意字符、任意次数,一旦遇到x就停下来。
-
转义符
有特殊意义或功能的字符,需要表达它符号本身的时候,就需要转义。正则表达式中的转义分为两种:
-
\
:在表达式中,任何有特殊意义或功能的字符前面加个\
都会丧失其特殊意义或功能。 -
[]
:在字符组中,所有的量词均丧失其特殊意义,变为普通字符,但-
在两个数值之间却表示一个范围,在其他位置才表示其本身。
-
-
-
网友评论