正则
在实际的应用中,我们会经常得到用户的输入,在得到用户的输入之后,需要我们对输入进行判断是否合法,比如判断输入的手机号码,从形式上来看是怎样的呢?
mu = input('请输入电话号码:') |
那有什么简单的方法呢?
正则搜索
match
import re |
search
import re |
通过对比,可以很明显的发现,下面这种方式能够简单快捷的匹配出电话号码
总结
正则表达式:正则表达式是一种通用的用来简洁表达一组字符串的表达式,因此,正则表达式是和python无关的,在其他的语言或者不同的系统中,是通用的。
匹配:通过正则表达式就可以去匹配现有的字符串。
应用:通过正则匹配,可以迅速的过滤出我们需要的全部或者一部分字符串,查找文本中的特质值(如:病毒)等等。
元字符
正则表达式该如何书写呢?
观察如下两个例子:
In [3]: re.search('a', 'abc') |
在第一个例子中,可以匹配出a
但是下面这个没有匹配出点,而是匹配到 a
这个 . 不是不能匹配到点,而是匹配任意字符,这个点已经被赋予了特殊的含义, .(点)就是一个元字符
正因为有这些元字符的存在,正则表达式才变得强大.
\b
In [23]: re.search('\bs\b', 'abcdsd s we') |
在正则中,加上r 去掉字符串的转义,以免影响正则的使用
\b匹配一个单词边界,也就是指单词和空格间的位置。
.
In [26]: re.search(r'.', 'abcdsd s we') |
匹配除换行符之外的所有的字符
\d
In [28]: re.search(r'\d',r'abc141342d') |
匹配0~9的数字
\s
In [30]: re.search(r'\s',r'abc 141342d') |
匹配任意的空白符,包括空格,制表符(Tab),换行符等
\w
In [31]: re.search(r'\w',r'abc 141342d') |
匹配字母或数字或下划线或汉字等
\b
In [32]: re.search(r'\bc\b',r'abc c 342d') |
\b 表示单词的边界
\ .
In [34]: re.search(r'\.',r'ab.c .bcb 342d') |
表示匹配点号本身
\D、\S、\W、\B
In [35]: re.search(r'\D','abc.1213') |
是与小写的相反的作用
\D
In [39]: re.search(r'\D','abc.1213') |
除了数字以外的字符
^
In [41]: re.search(r'^ab',r'abc 141342d') |
脱字符,匹配输入字符串的开始的位置
$
In [42]: re.search(r'd$',r'abc 141342d') |
匹配输入字符串的结束位置
{}
In [43]: re.search(r'\d{1,3}',r'abc 141 qw 342d') # 对象,找到一个就不找了 |
{M,N} :M和N 为非负整数,其中M<=N 表示前面的匹配M~N次
{M,}: 表示需要匹配M次
{,N}: 等价于{0~N}
{N}: 表示需要匹配N次
*
In [49]: re.findall(r'\d*',r'abc 141 qw 34325252d') |
匹配前面的子表达式零次或多次,等价于{0,}
+
In [51]: re.findall(r'\d+',r'abc 141 qw 34325252d') |
匹配前面的子表达式一次或多次,等价于{1,}
?
In [57]: re.findall(r'\d{0,1}',r'ab5252d') |
匹配前面的子表达式零次或一次,等价于{0,1}
贪婪与非贪婪
*?、+?
In [61]: re.findall(r'\d*?',r'ab5252d') |
在非贪婪模式下,始终找最短匹配
[]字符集合
[] 字符类,将要匹配的一类字符集放在[]里面
In [68]: re.findall(r'[\d]',r'abc 141 qw 34325252d') |
[ . ? * ( ) {} ] : 匹配里面的这些符号
[0-9]: 匹配0到9的数字相当于\d
\d: 匹配除数字以外的字符,相当于\D取反的意思
[a-z]: 匹配所有的小写字母
a-z : 匹配非小写字母
| : 相当于或(or)分支条件
()分组匹配
() 分组,将要匹配的一类字符集放在()组成一个小组
In [75]: re.findall(r'(32)',r'abc 141 qw 34325252d') |
分组匹配匹配() 内的字符串组合
re模块
compile
编译正则表达式为模式对象
当正则表达式多次使用,可以采用这种方式
In [78]: r = re.compile(r'\das') |
sub
字符串替换
In [80]: re.sub('i','o','pythin***pythin',1) |
match
从字符串开始位置匹配
In [83]: re.match(r'\d','123ad') |
group
得到匹配到的元素
In [94]: re.search(r'\d{1,3}',r'abc 141 qw 342d') |
start
得到开始位置
In [97]: li.start() |
end
得到结束位置
In [98]: li.end() |
span
得到位置范围
In [99]: li.span() |
注意:
这几个方法在search中也存在
扩展
在re中也有和字符串一样的split方法
In [85]: re.split(r'\s',' cee') |