(四)Python语法基础之正则表达式

正则表达式

正则表达式使用圆括号“()”表示一个子模式,圆括号内的内容作为一个整体出现。

(一)正则表达式与子模式扩展语法

  • 常用正则表达式元字符:
元字符 功能说明
. 匹配除换行符以外的任意单个字符
* 匹配位于“*”之前的字符或子模式的0次或多次出现
+ 匹配位于“+”之前的字符或子模式的1次或多次出现
- 用在[ ]之内用来表示范围
| 匹配位于“|”之前或之后的字符
^ 匹配行首,匹配以^后面的字符开头的字符串
$ 匹配行尾,匹配以$之前的字符结束的字符串
\ 表示位于\之后的为转义字符
\num 此处的num是一个正整数。例如:“(.)\1”匹配两个连续的相同字符
\f 换页符匹配
\n 换行符匹配
\r 匹配一个回车符
\b 匹配单词头或单词尾
\B 与\b含义相反
\d 匹配任何数字,相当于[0-9]
\ D 与\d含义相反,等效于[^0-9]
\s 匹配任何空白字符,包括空格、制表符、换页符,与[\f\n\r\t\v] 等效
\S 与\s含义相反
\w 匹配任何字母、数字以及下划线,相当于[a-zA-Z0-9]
\W 与\w含义相反
( ) 将位于内()内的内容作为一个整体来对待
[ ] 匹配位于[ ]中的任意一个字符
[^xyz] ^放在[ ]内表示反向字符集,匹配除x,y,z之外的任何字符
[a-z] 字符范围,匹配指定范围内的任何字符
[^a-z] 反向范围字符,匹配出除小写英文字母之外的任何字符
1.普通字符串就是最简单的正则表达式,只能够匹配自身
2.'[pjc]ython'---可以匹配'python','jython','cython'
3.'[a-zA-Z0-9]'---可以匹配任意一个大小写字母和数字
4.'[^abc123]'---可以匹配除abc123之外的任意一个字符
5.'python|perl'/'p(ython|erl)'---都表示可以匹配'python''perl'
6.(pattern)*---允许模式重复0次或多次
7.(pattern)+---允许模式重复1次或多次
8.(pattern){m,n}---允许模式重复m~n次
9.'(a|b)*c':匹配多个(包含0个)字母a或b,后面紧跟一个字母c
10.'^[a-zA-Z]{1}([a-zA-Z0-9._]){4,19}$'---匹配长度为5~20的字符串,必须以字母开头、可带数字、_、.、的字符串
11.'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'---检查所给字符串是否为合法的IP地址
12.'[\u4e00-\u9fa5]':匹配给定字符串中的所有汉字
  • 常用子模式扩展语法
语法 功能说明
(?P) 为子模式命名
(?iLmsux) 设置匹配标志,可以是几个字母的组合,每个字母含义与编译标志相同
(?:…) 匹配但不捕获该匹配的子表达式
(?P=groupname) 表示在此之前的命名为groupname的子模式
(? #…) 表示注释
(? = …) 用于正则表达式之后,表示如果“=”后的内容在字符串中出现则匹配,但不返回“=”之后的内容
(? ! …) 用于正则表达式之后,表示如果“!”后的内容在字符串中不出现则匹配,但不返回“!”之后的内容
(? <=…) 用于正则表达式之前,与(? = …)含义相同
(? 用于正则表达式之前,与(? ! …)含义相同
#子模式扩展语法
1.'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[,._]).{8,}$':检查给定字符串是否为强密码,必须同时包含英文大写字母、英文小写字母、数字或特殊符号,并且长度至少为8位。
2.'(?!.*[\'\''\/;=%?]).+':如果给定字符串中包含'''/;=%、?则匹配失败
3.'(.)\\1+':匹配任意一个字符的一次或多次出现
4.'((?P\b\w+\b)\s+(?P=f))':匹配连续出现两次的单词

(二)re模块方法与正则表达式对象

Python标准库re提供了正则表达式操作所需的功能
表:re模块常用方法

方法 功能说明
compile(pattern [ ,flags ]) 创建模式对象
search(pattern,string [ , flags ]) 在整个字符串中寻找模式,返回match对象或None
match(pattern,string [ , flags ]) 从字符串的开始处匹配模式,返回match对象或None
findall(pattern,string [ , flags ]) 列出字符串中模式的所有匹配项
split(pattern,string [ , flags ]) 根据模式匹配项分割字符串
sub(pattern,repl,string [ , count=0 ]) 将字符串中所有pat的匹配使用repl替换
escape(string) 将字符串中所有特殊正则表达式字符转义

Tips:
其中函数参数flags的值可以是re.I(表示忽略大小写)、re.L(支持本地字符集的字符)、re.M(多行匹配模式)、re.S(使元字符“.”匹配任何字符,包括换行符)、re.U(匹配Unicode字符)、re.X(忽略模式中的空格,并可以使用#注释);且上述各种flags可以用“|”进行不同组合。

  1. re.compil
re.compile(pattern [ ,flags ]
#用于创建模式对象
  1. re.search
re.search(pattern,string,flag) # 是从源字符串中(从左往右)找到第一个匹配项

     pattern 要进行匹配的正则表达式
     string 表示的是源字符串
     flag 标记(同上) 
  1. re.match
re.match(pattern,string,flag) # 是从源字符串的 起始位置开始查找一个匹配项

     pattern 要进行匹配的正则表达式
     string 表示的是源字符串
     flag 标记

# 如果匹配成功会返回一个对象
# 如果匹配失败 会 返回None
# 可以根据 结构是否为 None 来判断是否匹配成功
# 可以通过这个变量的group方法来获取结果;
# 如果没有匹配到,会返回None,此时如果使用group会报错
  1. re.findall
re.findall(pattern,string [,flag]) # 是从源字符串中找到所有的匹配项

     pattern 要进行匹配的正则表达式
     string 表示的是源字符串
     flag 标记, 可选参数
         re.I 使匹配对大小写不敏感
         re.M 多行匹配,是否影响 ^ 和 $
         re.S 使 . 匹配包含换行符在内的任意字符
         re.L 支持本地字符集的字符
         re.U 匹配Unicode字符
         re.X 忽略模式中的空格,并可以使用 '#'注释
# findall的结果是列表的形式,会将找到的多个结果放到列表中去;如果源字符串中无符合的字符则返回空列表
# 注意:不能直接使用 group 方法
res = re.findall("www","www.baidu.com")
res = re.findall("wwwa","www.baiduwww.com") # 结果:空列表[]
  1. re.split
 re.split(pattern,string [, flags])

    pattern,正则表达式, 即拆分规则/模式
    string, 被拆分的源字符串
    maxsplit=0, 最大拆分次数
    flags=0 标识(同上flags)

# 正则表达式来拆分字符串
strData ="wen1 is2 a3 old4 man5"
lis_re = re.split(" ",strData)
list_re=re.split("\d",strData)
print(lis_re)
print(list_re)
#运行结果如下
['wen1', 'is2', 'a3', 'old4', 'man5']
['wen', ' is', ' a', ' old', ' man', '']
[Finished in 0.6s]
  1. re.sub
str= "蔡徐篮球 是 xxx\n蔡徐坤歌手 是 yyy\n 肖战 是 帅哥"
# re.sub()
# sub(pattern,repl,string [ , count=0 ])
	pattern 匹配模式
	repl  用来替换的新字符串
	string   要替换的源字符串
	count=0  替换的次数,默认是全部替换
	flags=0  # 不能修改,默认可以不写 # 默认是 re.M 模式,会换行匹配所有

import re
str= "uziuzi is xxx\nuzimlxg is yyy\nuziii is so handsome"
res = re.sub("u.{,2}","史森明",str)
print(res)
#结果如下
史森明史森明 is xxx
史森明mlxg is yyy
史森明ii is so handsome
[Finished in 0.2s]    

subn与sub功能一致, 但是 sub是返回替 换后的新字符串;subn返回的是元组,元组有2个元素, 元素1代表替换后的新字符串, 元素2代表的替换的次数。

Ⅰ.直接使用re模块方法

>>>import re     #导入模块re
>>>text='alpha.beta...gamma delta'   #测试用的字符串text
>>>re.split('[\.]+',text)
['alpha','beta','gamma','delta']
>>>re.split('[\.]+',text,maxsplit=2)     #最多分隔两次
['alpha','beta','gamma delta']        

Ⅱ.使用正则表达式对象
首先使用re提供的compile方法将正则表达式编译生成正则表达式对象,然后再使用正则表达式对象提供的方法进行字符串处理。使用编译后的正则表达式对象不仅可以提高字符串的处理速度,还提供了更加强大的字符串处理功能。

exm='shandong insititute of business and technology'
pattern=re.compile(r'\bb\w+\b')  #用compile创建正则表达式对象,查找以b开头的单词
print(pattern.findall(exm))    #使用正则表达式对象的findall方法

Ⅲ.match对象
正则表达式模块或正则表达式对象的match()方法和search()方法匹配成功后都会返回match对象。match对象的主要方法有group()(返回匹配的一个或多个子模式内容)、groups()(返回一个包含匹配的所有子模式的内容的元组)、groupdict()(返回包含匹配的所有命名子模式内容的字典)、start()(返回指定子模式内容的其起始位置)、end()(返回指定子模式内容的结束位置的前一个位置)、span()(返回一个包含指定子模式内容起始位置和结束位置前一个位置的元组)等。

猜你喜欢

(三)Python语法基础之程序控制结构与函数设计(条件表达式、选择结构、循环结构、函数)
(二)Python语法基础之字符串及其格式化方法(%-format、format、f-string)
(一)Python语法基础之列表、元组、字典、集合

参考博文:Python re模块 (正则表达式用法剖析详解)

你可能感兴趣的:(Python基础语法)