一、前面简单写了一下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 re
text = ‘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.X
a = re.compile(r"""\d + # 整数部分
\. # 小数点
\d * # 小数部分
""", re.X) #可以转化成一行
b = re.compile(r"\d+\.\d*")