re的模块和正则表达式

re模块:是python提供的操作正则表达式的模块

示例:
import re phone_number = input('please input your phone number : ') if re.match('^(13|14|15|18)[0-9]{9}$',phone_number): print('是合法的手机号码') else: print('不是合法的手机号码')

正则表达式:匹配字符串内容的一种规则

字符集 [ ]  [里面必须是从小到大]

正则 待匹配字符 匹配结果 说明
[1234567789] 8 True 在一个字符组里每组合法的所有字符,字符组里的任意一个和‘待匹配字符’相同视为 可以匹配。
[0123456789] a Flase 由于字符组中没有‘a’字符,所有不匹配
[0-9] 7 True 也可以用—表示范围,[0-9]就是和[0123456789]是一个意思
[a-z] s True 同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示
[A-Z] B True 表示所有大写字母
[0-9a-fA-F] e True

可以匹配数字,大小写形式的a-f,用来验证十六进制字符

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

字符:

元字符 匹配内容
. 匹配除了换行符以外的任意字符

\w

(\W)

 

匹配字母或数字或下划线

(匹配非字母数字或数字或下划线)

 

 

\s

\S

匹配任意的空白符

匹配非空白符

\d

\D

匹配数字

匹配非数字

\n 匹配一个换行符
\t 匹配一个制表符
\b 匹配一个单词的结尾
^ 匹配字符串的开始
$ 匹配字符串的结尾
a|b 匹配字符a或字符b
() 匹配括号内的表达式,也可以表示一个组
[...] 匹配字符组中的字符
[^...] 匹配除了字符组中字符的所有字符

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

量词:

量词 用法说明
* 重复零次或更多次
+ 重复一次货更多次
重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

 

 

 

 

 

 

 

 

 

量词:

1.每一个量词只控制前一个字符的出现

2.这个两次的匹配为贪婪匹配模式

3.非贪婪匹配在量词后面加?

正则贪婪匹配就是回溯算法

PS:红色部分为常用的

 

re模块

import re
# ret = re.findall('<.*?>','<script>xxxxxxx<script>')   #直接返回匹配的列表
# print(ret)
# ret2 = re.search('<.*?>','safasf<script>xxxxxxx<script>')  #匹配找到的第一个结果
# print(ret2.group())
# ret3 = re.match('<.*?>','adfsd<script>xxxxxxx<script>')
# print(ret3)

在调用的角度上看,没有区别。

接受两个参数按照位置传,正则表达式的字符串和待匹配的字符串

返回值的区别:

findall:列表,匹配到的所有内容都会出现在列表中,如果没匹配到结果返回空列表

search:如果匹配到结果返回第一个匹配到的,如果没匹配到返回None

    匹配到的结果用group()方法获取

match:如果从头开始匹配到了就返回结果,否则返回None

   匹配到的结果用group()方法获取

示例:

ret = re.findall('a', 'eva egon yuan')
# print(ret)
# ret = re.search('a', 'eva egon yuan').group()
# print(ret)
#
# ret = re.match('b', 'abc').group()
# print(ret)

# ret = re.split('[bc]', 'abcd')
# print(ret)

# ret = re.sub('\d', 'H', 'eva3egon4yuan4',1)#将数字替换成'H',参数1表示只替换1个
# print(ret) #evaHegon4yuan4

# ret = re.subn('\d', 'H', 'eva3egon4yuan4')#将数字替换成'H',返回元组(替换的结果,替换了多少次)
# print(ret)

# obj = re.compile('\d{3}')  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
# ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
# print(ret.group())  #结果 : 123

import re
ret = re.finditer('\d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
for i in ret:
    print(i.group())
# print(next(ret).group())  #查看第一个结果
# print(next(ret).group())  #查看第二个结果
# print([i.group() for i in ret])  #查看剩余的左右结果

 re进阶:

findall的优先级查询
# import re # ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com') # print(ret) # ['oldboy'] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可 # ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com') # print(ret) # ['www.oldboy.com']
split的优先级查询 # import re # ret=re.split("\d+","eva3egon4yuan") # print(ret) #结果 : ['eva', 'egon', 'yuan'] # ret=re.split("(\d+)","eva3egon4yuan") # print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan'] # import re # ret = re.search("<\w+>(?P<content>\w+)</\w+>","<h1>hello</h1>") # print(ret.group()) # print(ret.group('content'))

分组:

对多个字符进行整体的量词约束

对于一条匹配的正则,只对其中我需要的内容进行分组

 

. ^ $
正则 待匹配字符 匹配结果 说明
海. 海鸥海水海带 海鸥海水海带 匹配所有的‘海.’的字符
^海. 海鸥海水海带 海鸥 只从头开始匹配‘海’
海.$ 海鸥海水海带 还带 只匹配结尾的‘海.$’

 

 

 

 

 

 

* + ? { }

正则 待匹配字符 匹配结果 说明
李.? 李杰和李莲英和李二棍子

李杰 李莲 李二

?表示重复零次或一次,即只匹配‘李后面一个任意字符’
李>* 李杰和李莲英和李二棍子 李杰和李莲英和李二棍子 *表示重复零次或多次,即只匹配‘李’后面0或多个任意字符
李>+ 李杰和李莲英和李二棍子 李杰和李莲英和李二棍子 +表示重复一次或多次,即只匹配‘李’后面1个或多个任意字符
李{1,2} 李杰和李莲英和李二棍子 李杰和 李莲英  李二棍 {1,2}匹配1到2次任意字符

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PS:前面*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配

正则 待匹配字符 匹配结果 说明
李.*? 李杰和李莲英和李二棍子 李  李  李 惰性匹配

 

 

 

 

 

贪婪匹配:

在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配

正则 待匹配字符 匹配
结果
说明
<.*> <script>...<script> <script>...<script>
默认为贪婪匹配模式,会匹配尽量长的字符串
<.*?> r'\d' <script>
<script>
加上?为将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串

 几个常用的非贪婪匹配Pattern

*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
.*?的用法
. 是任意字符
* 是取 0 至 无限长度
? 是非贪婪模式。
何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:
.*?x

就是取前面任意长度的字符,直到一个x出现

  

  

posted @ 2017-09-11 23:09  奋斗中的网络家园  阅读(54)  评论(0编辑  收藏  举报