正则re模块

目录

-正则

-修饰符

 -常用匹配模式

--示例

-一些正则匹配表达式


-正则

正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。

re提供的方法有:

import re
re.match       '''从开始位置开始匹配,如果开头没有则无'''
re.search      '''搜索整个字符串'''
re.findall     '''搜索整个字符串,返回一个list''' 
import re
#1
print(re.findall('e','alex make love') )   #['e', 'e', 'e'],返回所有满足匹配条件的结果,放在列表里
#2
print(re.search('e','alex make love').group()) #e,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。

#3
print(re.match('e','alex make love'))    #None,同search,不过在字符串开始处进行匹配,完全可以用search+^代替match

#4
print(re.split('[ab]','abcd'))     #['', '', 'cd'],先按'a'分割得到''和'bcd',再对''和'bcd'分别按'b'分割

#5
print('===>',re.sub('a','A','alex make love')) #===> Alex mAke love,不指定n,默认替换所有
print('===>',re.sub('a','A','alex make love',1)) #===> Alex make love
print('===>',re.sub('a','A','alex make love',2)) #===> Alex mAke love
print('===>',re.sub('^(\w+)(.*?\s)(\w+)(.*?\s)(\w+)(.*?)$',r'\5\2\3\4\1','alex make love')) #===> love make alex

print('===>',re.subn('a','A','alex make love')) #===> ('Alex mAke love', 2),结果带有总共替换的个数


#6
obj=re.compile('\d{2}')

print(obj.search('abc123eeee').group()) #12
print(obj.findall('abc123eeee')) #['12'],重用了obj
re提供的方法示例介绍
#为何同样的表达式search与findall却有不同结果:
print(re.search('\(([\+\-\*\/]*\d+\.?\d*)+\)',"1-12*(60+(-40.35/5)-(-4*3))").group()) #(-40.35/5)
print(re.findall('\(([\+\-\*\/]*\d+\.?\d*)+\)',"1-12*(60+(-40.35/5)-(-4*3))")) #['/5', '*3']

#看这个例子:(\d)+相当于(\d)(\d)(\d)(\d)...,是一系列分组
print(re.search('(\d)+','123').group()) #group的作用是将所有组拼接到一起显示出来
print(re.findall('(\d)+','123')) #findall结果是组内的结果,且是最后一个组的结果
search和findall

-修饰符

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。

修饰符为一个可选的标志  多个标志可以通过|来指定。如 re.L | re.M

re.search(r'[a-z]+','ajfoavnoaejgN1234ab9').group()        #返回'ajfoavnoaejg'
re.search(r'[a-z]+','jafjiNfhfheiHD1234a', re.I).group()   #返回'jafjiNfhfheiHD' 对大小写不敏感

 -常用匹配模式

模式概述
\w 匹配字母数字下划线
\W 匹配非字母数字下划线
\s 匹配任意空白字符,<==> [\t\n\r\f]

\S

匹配任意非空字符
\d 匹配任意数字,<==> [0-9]
\D 匹配任意非数字
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配什么开头
$ 匹配什么结尾
. 匹配任意字符(除了\n),当re.DOTALL被指定后,则包括\n
* 匹配0或多个表达式
+ 匹配1或多个表达式
? 匹配0或1个表达式,非贪婪
{n} 精确匹配n个前面的表达式
{m,n} 匹配m~n个前面的表达式,贪婪
a|b

匹配a或b

() 匹配括号内的表达式,分组
[...] 用来表示一组字符,单独列出,[abc]匹配'a','b','c'
[^...] 不在[]中的字符,[^abc]匹配除了abc的字符
\G 匹配最后匹配完成的位置

--示例

• \w与\W
print(re.findall('\w','hello weer 123'))       #['h', 'e', 'l', 'l', 'o', 'w', 'e', 'e', 'r', '1', '2', '3']
print(re.findall('\W','hello weer 123'))       #[' ', ' ']
 
• \s与\S
print(re.findall('\s','he\rllo\twmq\naj_12'))          #['\r', '\t', '\n']
print(re.findall(r'\n','he\rllo\twmq\naj_12'))          #['\n']
'''r代表告诉解释器使用rawstring,即原生字符串,把我们正则内的所有符号都当普通字符处理,不要转义'''
print(re.findall('\S','he\rllo\twmq\naj_12'))    #['h', 'e', 'l', 'l', 'o', 'w', 'm', 'q', 'a', 'j', '_', '1', '2']
# \n \t \r都是空,都可以被\s匹配
print(re.findall('\s','hello \n weer \t 123'))        #[' ', '\n', ' ', ' ', '\t', ' ']
 
• \d与\D
print(re.findall('\d','hello weer 123'))          #['1', '2', '3']
print(re.findall('\D','hello weer 123'))         #['h', 'e', 'l', 'l', 'o', ' ', 'e', 'g', 'o', 'n', ' ']
^与$
print(re.findall('^h','hello weer 123'))                    #['h']
print(re.findall('3$','hello weer 123'))                    #['3']
 
•   .
print(re.findall('a.b','a1b'))                         #['a1b']
print(re.findall('a.b','a1b a*b a b aaab'))            #['a1b', 'a*b', 'a b', 'aab']
print(re.findall('a.b','a\nb'))                        #[]
print(re.findall('a.b','a\nb',re.S))                   #['a\nb']
print(re.findall('a.b','a\nb',re.DOTALL))              #['a\nb']同上一条意思一样
*
print(re.findall('ab*','bbbbbbb'))                    #[]
print(re.findall('ab*','a'))                          #['a']
print(re.findall('ab*','abbbb'))                      #['abbbb']
 
• ?
print(re.findall('ab?','a'))                              #['a']
print(re.findall('ab?','abbb'))                           #['ab']
 
•  .*默认为贪婪匹配
print(re.findall('a.*b','a1b22222222b'))              #['a1b22222222b']
print(re.findall('a.*','a1b22222222b'))               #['a1b22222222b']
 
•  .*?为非贪婪匹配:推荐使用
print(re.findall('a.*?b','a1b22222222b'))               #['a1b']
+
print(re.findall('ab+','a'))                                #[]
print(re.findall('ab+','abbb'))                             #['abbb']
 
• {m,n}
print(re.findall('ab{2}','abbb'))                            #['abb']
print(re.findall('ab{2,4}','abbb'))                          #['abb']
print(re.findall('ab{1,}','abbb'))                           #'ab{1,}' ==> 'ab+'
print(re.findall('ab{0,}','abbb'))                           #'ab{0,}' ==> 'ab*'
 
• [ ]
print(re.findall('a[1*-]b','a1b a*b a-b'))       #[]内的都为普通字符  且如果-没有被转意的话,应该放到[]的开头或结尾
print(re.findall('a[^1*-]b','a1b a*b a-b a=b'))  #[]内的^是取反,所以结果为['a=b']
print(re.findall('a[a-zA-Z]b','a1b a*b a-b a=b aeb aEb'))
 
•  ()   分组
print(re.findall('ab+','ababab123'))                       #['ab', 'ab', 'ab']
print(re.findall('(ab)+123','ababab123'))                  #['ab'],匹配到末尾的ab123中的ab
print(re.findall('(?:ab)+123','ababab123'))                #findall的结果不是匹配的全部内容,而是组内的内容, ?:可以让结果为匹配的全部内容
print(re.findall('href="(.*?)"','<a href="http://www.baidu.com">点击</a>'))                     #['http://www.baidu.com']
print(re.findall('href="(?:.*?)"','<a href="http://www.baidu.com">点击</a>'))# 
 ['href="http://www.baidu.com"']
print(re.findall('compan(?:y|ies)','Too many companies have gone bankrupt, and the next one is my company'))         #['companies', 'company']
re匹配模式示例
基于递归和正则表达式实现的计算器:https://www.cnblogs.com/wupeiqi/articles/4949995.html

-一些正则匹配表达式

Email地址:  ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
手机号码:   ^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
身份证号(15位、18位数字):   ^\d{15}|\d{18}$
密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):  ^[a-zA-Z]\w{5,17}$
强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):   ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
xml文件:   ^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
腾讯QQ号:   [1-9][0-9]{4,} (腾讯QQ号从10000开始)
中国邮政编码:  [1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
IP地址.1:    \d+\.\d+\.\d+\.\d+ (提取IP地址时有用)
IP地址.2:    ((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

 

 
posted @ 2022-10-29 19:25  weer-wmq  阅读(30)  评论(0编辑  收藏  举报