一、前面简单写了一下re模块操作字符串的写法,加上正则之后 re模块才能发挥更强大的功能。
先看看常见的正则符号:
复习一下基础的re模块:
import re text = ‘c++ python2 python3 perl ruby lua java javascript php4 php5 c‘ #match,search,findall,split,sub re.match(r‘java‘,text)#只找头,没有的话返回none 返回一个<_sre.SRE_Match object; span=(34, 38), match=‘java‘> re.search(r‘java‘,text)#从头开始找,找符合的字符 # <_sre.SRE_Match object; span=(34, 38), match=‘java‘> re.match(r‘c\++‘,text),re.match(r‘c\+\+‘,text)#作用相同 #<_sre.SRE_Match object; span=(0, 3), match=‘c++‘> re.findall(r‘python‘,text) #返回所有的python # [‘python‘, ‘python‘] re.split(r‘ perl ‘,text)#以某个字符为中心拆分 #[‘c++ python2 python3‘, ‘ruby lua java javascript php4 php5 c‘] re.sub(r‘ruby‘,‘fortran‘,text) #替换某个字符 #‘c++ python2 python3 perl fortran lua java javascript php4 php5 c‘
二、正则常用
text = ‘c++ python2 python3 perl ruby lua java javascript php4 php5 c‘
1 ^ start 从开头开始匹配 例: re.findall(r‘^c..‘,text) 输出#[‘c++‘] 2 . except \n 匹配除换行符以外所有字符 re.findall(r‘^c‘,text) #[‘c‘]re.findall(r‘^c.‘,text)#[‘c+‘] 3 + 1-inf 匹配一个或一个以上相同的值从1---无穷 re.findall(r‘c+‘,text) #[‘c‘, ‘c‘, ‘c‘] re.findall(r‘c\++‘,text) #[‘c++‘] 4 $ end 匹配最后一个字符 re.findall(r‘c$‘,text)
5 [] or 指的是或 re.findall(r‘p[a-zA-Z]+‘,text) #匹配p字符后面是(a-z)从小写字符a-z和大写A-Z的字符 #{1,}匹配1到无穷个 #[‘python‘, ‘python‘, ‘perl‘, ‘pt‘, ‘php‘, ‘php‘] 6 * 0-inf 0到无穷个 re.findall(r‘p[a-zA-Z]*‘,text) #[‘python‘, ‘python‘, ‘perl‘, ‘pt‘, ‘php‘, ‘php‘] 7 ? 0-1 匹配0--1个 re.findall(r‘p[a-zA-Z]?‘,text) #[‘py‘, ‘py‘, ‘pe‘, ‘pt‘, ‘ph‘,‘p‘, ‘ph‘, ‘p‘] re.findall(r‘p[a-zA-Z0-9]{3,}‘,text) #{3,}指的是匹配三个字母以上 #[‘python2‘, ‘python3‘, ‘perl‘, ‘php4‘, ‘php5‘] re.findall(r‘c[a-zA-Z]*‘,text) #[‘c‘, ‘cript‘, ‘c‘] re.findall(r‘c[^a-zA-Z]*‘,text) # ^号也可以指非的意思(当^号在中括号里面) 匹配非字母的符号 #[‘c++ ‘, ‘c‘, ‘c‘] 8 | or 或也可以写成|号 看看他与[]号的区别 re.findall(r‘[pj][a-zA-Z]+‘,text) #{1,inf} #[‘python‘, ‘python‘, ‘perl‘, ‘java‘, ‘javascript‘, ‘php‘, ‘php‘] |重写上面的pattern re.findall(r‘p|j[a-zA-Z]+‘,text) #|号指的是前面的或者是后面的因此需要修改程序 #[‘p‘, ‘p‘, ‘p‘, ‘java‘, ‘javascript‘, ‘p‘, ‘p‘, ‘p‘, ‘p‘] re.findall(r‘p[a-zA-z]+|j[a-zA-Z]+‘,text) #相当于[pj][a-z][A-Z]的分开 re.findall(r‘p[^0-9]+|j[a-zA-Z]+‘,text) #注意空格也会被匹配为非数字 #[‘python‘, ‘python‘, ‘perl ruby lua java javascript php‘, ‘php‘] re.findall(r‘p[^0-9 ]+|j[a-zA-Z]+‘,text) #[‘python‘, ‘python‘, ‘perl‘, ‘java‘, ‘javascript‘, ‘php‘, ‘php‘] 9 \w [a-zA-Z0-9_], \W #匹配所有的小写大写下划线 \W指的是\w的非 re.findall(r‘p\w+‘,text)
#[‘python2‘, ‘python3‘, ‘perl‘, ‘pt‘, ‘php4‘, ‘php5‘]10 \d [0-9], \D ##匹配所有的数字 \D是\d的非 re.findall(r‘p\w+\d‘,text) re.findall(r‘p\w+[0-9]‘,text) re.findall(r‘p\w{5,9}‘,text) #匹配有5--9个字符 #[‘python2‘, ‘python3‘] 11 \s [ \t\n\r\f\v], \S#匹配所有的空白字符 12 \b word boundary 匹配一个字符的边界,以什么开始什么结束 re.findall(r‘\bp[^0-9]‘,text) #[‘py‘, ‘py‘, ‘pe‘, ‘ph‘, ‘ph‘] re.findall(r‘p[^0-9]\b‘,text) #[‘pt‘]13 \B not \b \A input start, ^ \Z input end, $ 同上 14 贪婪与非贪婪
*贪婪模式尽可能的匹配多 *? 0~inf non-greedy #非贪婪模式尽可能匹配少 +? 1~inf non-greedy #非贪婪模式尽可能匹配少re.findall(r‘p[a-z]*‘,text) #[‘python‘, ‘python‘, ‘perl‘, ‘pt‘, ‘php‘, ‘php‘]re.findall(r‘p[a-z]*?‘,text) #[‘p‘, ‘p‘, ‘p‘, ‘p‘, ‘p‘, ‘p‘, ‘p‘, ‘p‘]re.findall(r‘p[a-z]+\b‘,text)re.findall(r‘p[a-z]+?\b‘,text) 15 分组
(?P<name>pattern)a=re.search(r‘(p[a-zA-Z]+)([0-9])‘,‘python2‘,re.X) #re.X可以不写(re.X)编译字符里面可以注释a.group(1), a.group(2) #‘python‘ #‘2‘ a=re.search(r‘(?P<name>p[a-zA-Z]+)(?P<version>[0-9])‘,‘python2‘) #以字典形式输出a.group(‘name‘), a.group(‘version‘)a.groupdict() #{‘name‘: ‘python‘, ‘version‘: ‘2‘}
16 混合编写pattern = re.compile(r‘(?P<name>p[a-zA-Z]+)(?P<version>[0-9])‘)#公式results = pattern.search(‘python2‘)#带入print (results.groupdict())results = pattern.search(‘python3‘)print (results.groupdict())results = pattern.search(‘php4‘)print (results.groupdict()) #{‘name‘: ‘python‘, ‘version‘: ‘3‘}
17 字典循环import retext = ‘c++ python2 python3 perl ruby lua java javascript php4 php5 c‘pattern = re.compile(r‘(?P<name>p[a-zA-Z]+)(?P<version>[0-9])‘)#公式for t in text.split(‘ ‘): results = pattern.search(t) if results: print (results.groupdict()) #{‘name‘: ‘python‘, ‘version‘: ‘2‘} #{‘name‘: ‘python‘, ‘version‘: ‘3‘} #{‘name‘: ‘php‘, ‘version‘: ‘4‘} #{‘name‘: ‘php‘, ‘version‘: ‘5‘}
18 编译字符re.Xa = re.compile(r"""\d + # 整数部分 \. # 小数点 \d * # 小数部分 """, re.X) #可以转化成一行b = re.compile(r"\d+\.\d*")
原文地址:https://www.cnblogs.com/jeepzp/p/8257177.html
时间: 2024-08-30 07:44:16