一、正则表达式 定义:正则表达式是一个特殊的字符串序列,一个字符串是否与我们所设定的这样的字符序列,相匹配。 正则表达式的作用 :它的作用:快速检查文本,实现一些替换文本的操作。比如:
1,检查一串数字是否是电话号码形式
2,检测一个字符串是否符合email的格式
3,把一个文本里指定的单词替换为另外一个单词
查找是否包含某个字符串 比如有字符串: a = ‘C|C++|Java|C#|Python|JavaScript’。看以下示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import re a = 'C|C++|Java|C#|Python|Jav|Python|aScript' #内置函数 #是否包含'Python' # print(a.index('Python') > -1) #是否包含'Python' # print('Python' in a) #返回一个列表 r = re.findall('Python',a) if len(r) != 0: print('字符串包含Python') else: print('字符串包含PHP') r = re.findall('Python',a) # if len(r) != 0: # print('字符串包含PHP')
正则表达式的灵魂是规则 ,上面的代码是一个常量,不能说不是规则,不过这并不是正则表达示的广泛应用。
找出字符串中所有的数字 字符串:a = ‘C|C++7|Java8|C#8|Python8|Jav|Python|aScript’
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 'Python':是普通字符 '\d':是元字符 #正则表达式就是元字符和普通字符的组合 #元字符 [百度百科正则表达式](https://baike.baidu.com/item/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1700215?fr=aladdin) import re a = 'C|C++7|Java8|C#8|Python8|Jav|Python|aScript' #规则 #打印出所有的数字 r = re.findall('\d',a) print(r) #匹配一个非数字字符。等价于[^0-9]。grep要加上-P,perl正则支持 r = re.findall('\D',a) print(r) #打印结果 PS G:\python> python test14.py ['0', '7', '8', '9', '3']
1,字符集操作 a = ‘abc,acc,adc,aec,afc,ahc’,找到’a[cf]c’,就是找到字符串中间是c或f,两边分别是a和c。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #字符集 import re a = 'abc,acc,adc,aec,afc,ahc' #字符集的特性:[]中间的字符是 或 关系 r = re.findall('a[cf]c',a) print(r) #打印 PS G:\python\正则表达式> python test15.py ['acc', 'afc'] import re a = 'abc,acc,adc,aec,afc,ahc' #匹配不是c、f、d的字符 r = re.findall('a[^cfd]c',a) print(r) #打印结果 PS G:\python\正则表达式> python test15.py ['abc', 'aec', 'ahc'] import re a = 'abc,acc,adc,aec,afc,ahc' #匹配是c到f的字符 r = re.findall('a[c-f]c',a) print(r) #打印结果 PS G:\python\正则表达式> python test15.py ['acc', 'adc', 'aec', 'afc']
2,概括字符集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #找出全部数字 # '\d'就是一个概括字符集 import re a = 'a111456pythonjava678php' #以下两种方式都可以,正则表达式很灵活 r = re.findall('\d',a) r = re.findall('[0-9]',a) #非数字 r = re.findall('[^0-9]',a) #数字和字母全匹配 r = re.findall('\w',a)# & 符号就不可以匹配 a = 'a 1\n4\r5\tp2g&__ r = re.findall('\W',a) #大写的W print(r) #打印 PS G:\python\正则表达式> python test16.py [' ', '\n', '\r', '\t', '&'] # import re a = 'a145 p2\rg&__' print(r) #打印结果 PS G:\python\正则表达式> python test16.py [' ', '\r']
小总结:
1 2 3 4 #概括字符集 # \d \D # \w单词字符 \W # \s空白字符 \
3,数量词
1 2 3 4 5 6 7 8 9 # import re a = 'python 145java678php' r = re.findall('[a-z]{3,6}',a) #3到6个都可以 print(r) #打印 结果 PS G:\python\正则表达式> python test17.py ['python', 'java', 'php']
为什么匹配到3个不会输出,而是会继续匹配?这涉及数量词的一个重要概念。贪婪模式和非贪婪模式 数量词的贪婪和非贪婪方式:python的数量词默认是贪婪方式,所以匹配到3个的时候,会继续匹配,到第六个都匹配,后面不配,就才结束。所以会匹配出:python、java、php。
非贪婪模式:在规则后面加’?’:’[a-z]{3,6}?’ 以上规则打印结果:[‘pyt’, ‘hon’, ‘jav’, ‘php’]
1 2 3 4 5 6 7 8 9 #以下三种情况第一行是代码,第二行是对应代码的输出结果。 r = re.findall('python*',a) ['pytho', 'python', 'pythonn'] r = re.findall('python+',a) ['python', 'pythonn'] r = re.findall('python?',a) ['pytho', 'python', 'python']
1 2 3 4 5 6 7 8 9 10 import re language = 'Pythonc#JavaPHP' #(python) 加了括号就是一个组,(python){3}这个组出现3次 #re.I 忽略大小写 r = re.findall('C#',language,re.I) print(r) #打印结果 PS G:\python\正则表达式> python test17.py ['c#']
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import re language = 'PythonC#\nJavaPHP' #(python) 加了括号就是一个组,(python){3}这个组出现3次 #re.I 忽略大小写 r = re.findall('c#.{1}',language,re.I) print(r) #打印 PS G:\python\正则表达式> python test17.py [] #加入re.S规则,就能匹配\n import re language = 'PythonC#\nJavaPHP' #(python) 加了括号就是一个组,(python){3}这个组出现3次 #re.I 忽略大小写 r = re.findall('c#.{1}',language,re.I | re.S) print(r) PS G:\python\正则表达式> python test17.py ['C#\n']
贪婪模式和非贪婪模式
1 2 3 4 5 6 7 8 9 10 11 12 #非贪婪和贪婪模式 language = 'pythocpython#JavaPHPpythonn' #['pytho', 'python', 'python']python'] r = re.findall('python?',language) print(r) #['python', 'python'] s = re.findall('python{1,2}?',language) print(s) #['python', 'pythonn'] t = re.findall('python{1,2}',language) print(t)
边界匹配 qq号是否匹配(4到8位)?