首页 > 代码库 > 走入计算机的第二十五天(内置模块3之正则表达式)
走入计算机的第二十五天(内置模块3之正则表达式)
一 什么是正则表达式
就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。
正则表达式的功能:字符串的模糊匹配查询。
二 re模块
不同的语言均有使用正则表达式的方法,python中是用re模块实现的。
使用的方法格式:变量名=re.re中的其中一个子模块("规则","内容")
元字符
1 .(点) :可以代替除换行符以外任意一个元素
1 # ret=re.findall("方..","方杰,方合意,方磊,光东,阿杰,李杰,方何军") ##匹配出所有符合条件的元素 2 # print(ret)
2 ^ :匹配第一个 元素的类容,匹配不成功,也不会去匹配后面的元素
# ret=re.findall("^方.","方杰,方合意,方磊,光东,阿杰,李杰,方何军") #匹配出所有符合条件的元素 # print(ret)
3 $ :匹配该对象的最后一个内容,不会去匹配其他位置的内容
ret=re.findall("y..n$","方杰,方合意,方磊,光东,阿杰,李杰,方何军yuan") #匹配出所有符合条件的元素 # print(ret)
4 * :匹配表达式内容的0次到无数次
#ret=re.findall("333\d*","333234214455,333255654534246,545556564367656653,4453576489780423") # print(ret)
5 + : 匹配表达式内容的1次到无数次
#ret=re.findall("333\d+","3334214455,333255654534246,333,56564367656653,4453576489780423") # print(ret)
6 ?: 匹配表达式内容的0次或者1次
# ret=re.findall("\d?","2342,43,7654,87") # print(ret)
7 {}:自定义次数
#ret=re.findall("\d{16}","234214455,663255654534246,545556564367656653,4453576489780423") # print(ret)
*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配
# ret=re.findall(‘131\d+?‘,‘1312312312‘) # print(ret)
匹配一个数字包括整型和浮点型
# ret=re.findall("\d+\.?\d+","3555,8498,64.674,2344") # print(ret)
转义符
1 反斜杠后面跟元字符,会去掉特殊的功能
# ret=re.findall("\.com","www.baidu.com,www.youji.com,www.xiongdi.com,www.ss.cn") # print(ret)
2 反斜杠后面加上一些普通字符会实现一些特殊的功能
\d 匹配任何十进制数; 它相当于类 [0-9]。
# ret=re.findall("\d","yuan3236$655&34") # print(ret)
\D 匹配任何非数字字符; 它相当于类 [^0-9]。
# ret=re.findall("\D","yuan3236$655&34") # print(ret)
\s 匹配任何空白字符; 它相当于类 [ \t\n\r\f\v]。
# ret=re.findall("\s","hello i love like") # print(ret)
\S 匹配任何非空白字符; 它相当于类 [^ \t\n\r\f\v]。
# ret=re.findall("\S","hello i love like") # print(ret)
\w 匹配任何字母数字字符; 它相当于类 [a-zA-Z0-9_]。
# ret=re.findall("\w","yuan323665534") # print(ret) # ret=re.findall("\w+","yuan323665534") # print(ret)
\W 匹配任何非字母数字字符; 它相当于类 [^a-zA-Z0-9_]
# ret=re.findall("\W","yuan3236$655&34") # print(ret)
\b 匹配一个特殊字符边界,比如空格 ,&,#等\b是特殊符号所以前面需要加r
# ret=re.findall(r"i\b","hello i love like") # print(ret) # ret=re.findall(r"i\b","hello i love li$ke") # print(ret)
分组 ()
ret=re.findall("(fang)","fangffksdl;hfangfangfnag") # print(ret) # # ret=re.findall("(fang)+","fangffksdl;hfangfangfnag") # print(ret)
# ret=re.findall("方","方杰,方合意,方磊,光东,阿杰,李杰,方何军") ##匹配出所有符合条件的元素
# print(ret) m = re.findall(r‘(ad)+‘, ‘add‘) print(m) ret=re.search(‘(?P<id>\d{2})/(?P<name>\w{3})‘,‘23/com‘) print(ret.group())#23/com print(ret.group(‘id‘))#23
#命名分组
ret=re.search(r"blog-aticles-(?P<year>20[01]\d)-(\d+)","blog-aticles-2005-12")
print(ret.group(‘year‘))
ret=re.search(r"blog-aticles-(?P<year>20[01]\d)-(?P<mansh>\d+)","blog-aticles-2005-12")
print(ret.group(‘mansh‘))
字符集 |
字符集 | 或者的意思 要配合 ()用的
# ret=re.findall("www\.(\w+)\.(com|cn)","www.baidu.com,www.youji.com,www.xiongdi.com,www.ss.cn") # print(ret) # ret=re.findall("www\.(?:\w+)\.(?:com|cn)","www.baidu.com,www.youji.com,www.xiongdi.com,www.ss.cn") # print(ret)
字符集 []
字符集[]: 在[]里面多选一的效果 一个字符集只匹配一个字符
# ret=re.findall(r"a[bc]","abcjpofdabhiac") # print(ret) # ret=re.findall(r"a[bc]d","abdcjpofdabhiacd") # print(ret) # ret=re.findall(r"a[b.c]d","abcjpofdabhia.dc") # print(ret)
字符集里面只有三个特殊符号:- ^ \
# ret=re.findall(r"[0-9]","ds1246634347cvkdhsd") # print(ret) # # # ret=re.findall(r"[a-z]","ds1246634347cvkdhsd") # print(ret) # # ret=re.findall(r"[A-Z]","ds1246DSJFKS47cvkdhsd") # print(ret) # # ret=re.findall(r"[A-Za-z0-9]","ds1246634347cvkdhsd") # print(ret) # ret=re.findall(r"a[\d]c","ds12a34c7cvkdhsd") # print(ret) # ret=re.findall(r"[^\d]","ds1246634347cvkdhsd") # print(ret) # ret=re.findall(r"[^\da-z]","ds1246634347cvk#dhsd") # print(ret)
search 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,没有则会则返回None,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,就会报错
#只有匹配到了一项内容就不会在继续匹配了 ret=re.search("(fang)+","fangffksdl;hfangfangfnag") print(ret) print(ret.group()) #没有匹配内容则会返回None,group()则会报错报错 ret=re.search("(fakl)+","fangffksdl;hfangfangfnag") print(ret) print(ret.group())
match 函数会在字符串开始位置查找模式匹配对象,没有则会则返回None,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,就会报错
#match 只匹配字符串开头的位置 # ret=re.match("(fang)+","fangffksdl;hfangfangfnag") # print(ret) # print(ret.group()) #开头位置匹配不上就会报错 # ret=re.match("(fang)+","sdffangffksdlaihngfangfnag") # print(ret) # print(ret.group())
,
走入计算机的第二十五天(内置模块3之正则表达式)