python基础(正则表达式)

来源:互联网 发布:java能调用api 编辑:程序博客网 时间:2024/06/05 17:15

正则表达式用于搜索、替换和解析字符串。正则表达式遵循一定的语法规则,使用非常灵活,功能强大。使用正则表达式编写一些逻辑验证非常方便,例如电子邮件地址格式的验证。python提供了re模块实现正则表达式的验证。

1.简介
正则表达式是用于文本匹配的工具,它在源字符串中查找与给定的正则表达式相匹配的部分,一个正则表达式是由字母、数字和特殊字符(括号、星号、问号)组成,正则表达式中有许多特殊的字符,这些特殊字符是构成正则表达式的要素。

正则表达式中的特殊字符:
^ —–正则表达式的开始符号
$ —–正则表达式的结束符号
\w ——匹配字母、数字、下划线
\W —–匹配不是字母、数字、下划线的字符
\s —–匹配空白字符
\S —–匹配不是空白的字符
\d —-匹配数字
\D —-匹配非数字的字符
\b —-匹配单词的开始和结束
\B —-匹配不是单词开始和结束
. —-匹配任意字符,包括汉字

如果要匹配电话号码,需要形如“\d\d\d\d-\d\d\d\d\d\d\d”这样的正则表达式,其中出现了11次“\d”,表达方式繁琐,正则表达式提供了对表达式的一部分进行重复处理的功能。

正则表达式中的常用限定符:
* —–匹配零次或多次
+ —–匹配一次或多次
? —–匹配一次或零次
{m} —-重复m次
{m,n} —重复m到n次,其中n可以省略

利用{}可以控制字符重复的次数,例如\d{1,4}表示1~3位数字,前面提到的电话号码采用如下的正则表达式:

\d{3}-\d{8}|\d{4}-\d{7}

如果要对正则表达式进行嵌套,就需要使用分组“()”,例如,对3位数字重复3次,可以使用如下的正则表达式表示:

(\d\d\d){2}

默认情况下,正则表达式将匹配最长的字符串作为结果,可以通过在限定符后面添加“?”的方式,获取最短的匹配结果,例如,对字符“a”到字符“c”之间的字符进行匹配。

2.使用re模块处理正则表达式
python的re模块具有正则表达式匹配的功能,re模块提供了一些根据正则表达式进行查找、替换、分隔字符串的函数,这些函数使用一个正则表达式作为第一个参数。

re模块的常用函数:
findall(pattern,string,flags=0):根据pattern在string中匹配字符串。如果匹配成功,返回包含匹配结果的结果列表,否则,返回空列表。

sub(pattern,repl,string,count=0):根据指定的正则表达式,替换源字符串中的 子串。pattern是一个正则表达式,repl是用于替换的字符串,string是源字符串,如果count等于0,则返回string中匹配的所有结果,如果,count大于0,则返回前count个匹配结果。

match(pattern,string,flags=0):根据pattern从string的开头匹配字符串,只返回第一次匹配成功的对象,否则,返回None

search(pattern,string,flags=0):根据pattern从string中匹配字符串,只返回第一次匹配成功的对象,否则,返回None

compile(pattern,flags=0)编译正则表达式pattern,返回一个pattern对象。

escape(pattern):匹配字符串中的特殊字符,如*、+、?等

练习1:

import re#^与$的使用s = "HELLO WORLD"print(re.findall(r"^hello",s))  #默认区分大小写的从字符串开头匹配以“hello”开始的字符串print(re.findall(r"hello",s,re.I))  #re.I为辅助参数,表示忽略大小写,不区分大小写的从字符串开头匹配以“hello”开始的字符串print(re.findall(r"woRLD$",s))    #默认区分大小写的从字符串尾部匹配以“hello”开始的字符串print(re.findall(r"woRLD$",s,re.I))  #不区分大小写的从字符串尾部匹配以“hello”开始的字符串print(re.findall(r"\b\w+\b",s))   #匹配每个英文单词s = "hello world"print(re.sub("hello","hi",s))print(re.sub("hello","hi",s[-4:]))  #在切片是[-4:]范围内替换“hello”,即在字符串“orld”中替换“hello”print(re.sub("world","China",s[-5:]))  #在分片s[-5:]范围内替换“world”,即把字符串“world”替换为“China”s = "你好 WORLD2"print("匹配字母数字:"+re.sub(r"\w","hi",s))print("替换次数:"+str(re.subn(r"\w","hi",s)[1]))print("匹配任意字符:"+re.sub(r".","hi",s))print("替换次数:"+str(re.subn(r".","hi",s)[1]))

运行结果:

D:\Python36\python.exe E:/demo_py/python/char_6/re_sign.py[]['HELLO'][]['WORLD']['HELLO', 'WORLD']hi worldorldChina匹配字母数字:hihi hihihihihihi替换次数:8匹配任意字符:hihihihihihihihihi替换次数:9

练习2:

import retel1 = "0791-1234567"print(re.findall(r"\d{3}-\d{8}|\d{4}-\d{7}",tel1))  #匹配区号为3位的8位数电话号码或区号为4为的7位数电话号码,区号和电话号码之间用—连接tel2 = "010-12345678"print(re.findall(r"\d{3}-\d{8}|\d{4}-\d{7}",tel2))tel3 = "(010)12345678"print(re.findall(r"[\( ]?\d{3}[\]-]?\d{8}|[\( ]?\d{4}[\]-]?\d{7}",tel3)) #匹配区号为3位的8位数电话号码或区号为4为的7位数电话号码,区号和电话号码之间用—连接,或区号两侧加圆括号

运行结果:

D:\Python36\python.exe E:/demo_py/python/char_6/re_number.py['0791-1234567']['010-12345678']

练习3:

import res = "1abc23def45"p = re.compile(r"\d+")  #返回一个正则表达式对象P,匹配变量s中的数字print(p.findall(s))  #调用p中的findall()方法,匹配的结果存放在列表中print(p.pattern)   #输出当前使用的正则表达式p = re.compile(r"(abc)\1")  #定义一个分组"(abc)",在后面使用“1”再次调用该分组,compile()返回一个包含2个分组的正则表达式对象Pm = p.match("abcabcabc")  #对字符串进行搜索,返回一个match对象mprint(m.group(0))   #匹配0号组print(m.group(1))   #匹配1号组print(m.group())    #默认返回0号组p = re.compile(r"(?P<one>)abc(?P=one)")  #给分组命名one表示分组的名称,“(?P=one)调用分组one,相当于“\1””m = p.search("abcabcabc")print(m.group("one"))print(m.groupdict().keys())  #获取正则表达式中分组的名称print(m.groupdict().values())#获取正则表达式中分组的内容print(m.re.pattern)  #获取当前使用的正则表达式

运行结果:

D:\Python36\python.exe E:/demo_py/python/char_6/re.compiler.py['1', '23', '45']\d+abcabcabcabcabcdict_keys(['one'])dict_values([''])(?P<one>)abc(?P=one)
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 车辆超速扣12分怎么办 一次超速扣12分怎么办 分扣了罚款未交怎么办 c照一次扣12分怎么办 人在外地身份证到期了怎么办 手机进水了屏幕不亮怎么办 北京一证通过期怎么办 小米6音量键进水怎么办 考驾照怕过不了怎么办 学车对车没感觉怎么办 居住证到期2个月怎么办 生育险差一个月怎么办 驾照扣了38分怎么办 新疆转入山东上学怎么办手续 驾照过日期换证怎么办 机动车被扣24分怎么办 车辆被扣24分怎么办 现在深圳牌十年老车怎么办? 护士证过期4年了怎么办 护士资格证延续注册过期了怎么办 护士资格证过期没注册怎么办 护士资格证注册时间过期怎么办 辅警体检视力不行怎么办 护士延续注册体检怀孕怎么办 护士资格证没有延续注册怎么办 申请信用卡没有座机号码怎么办 网上申请信用卡没有座机号码怎么办 我叫上门服务被骗了怎么办 上门服务被骗了3000多怎么办 微信被骗9000元怎么办 奥迪a8气囊灯亮怎么办 驾考站岗迟到了怎么办 老板欠员工工资不给怎么办 如果有一天我没头发了怎么办 苏州公积金密码忘了怎么办 科二考试第二把怎么办 科一老是记不住怎么办 科目二考试没去怎么办 网约车驾龄不到怎么办 科四预约不上怎么办 教练不退钱怎么办找谁