序
今天我们来学习Python的正则表达式,我想接触过其他语言的朋友一定不陌生,正则表达式并不是python特有的,其他语言也有正则表达式。
正则表达式的官方介绍为:正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
学习点
在python中使用正则表达式,需要在文件头部引入正则表达式的内置对象才能使用
import re
常用的方法为
re.findAll()
例1 匹配数字
import re
a='hdhfdh55df5df49d+'
r=re.findall('\d',a)
print(r)
输出:[‘5’, ‘5’, ‘5’, ‘4’, ‘9’]
解释:
方法中的第一个参数 /d 表示只匹配字符串中的数字,第二个参数 a 表示需要操作的字符串变量
想了解更多的正则表达式方法可自行进行百度学习,这里只进行部分常见的规则进制学习。
例2 字符集
#字符集
import re
a='abc,abd,acc,abd,asd'
r=re.findall('a[cb]d',a)
s=re.findall('a[^cb]d',a)
print(r)
print(s)
输出1:[‘abd’, ‘abd’]
输出2:[‘asd’]
解释:
方法中第一个参数使用了 [cd ] 这个符号,表示只要子子串中出现了其中一个都会匹配上,反之如果是这样 [^cd ] 符号中加了 ^ 符号则表示子串中只要包含了其中一个字符都不会被匹配上
例3 概括字符集
#概括字符集
import re
#\d 数字 \D 非
#\w 单词字符 \W 非
# \s 空白字符 \S 非
a='5566dfd5fdg5gs26s0'
r=re.findall('[1-9]',a)
s=re.findall('[^0-9]',a)
f=re.findall('\w',a)
print(r)
print(s)
print(f)
输出:
[‘5’, ‘5’, ‘6’, ‘6’, ‘5’, ‘5’, ‘2’, ‘6’]
[‘d’, ‘f’, ‘d’, ‘f’, ‘d’, ‘g’, ‘g’, ‘s’, ‘s’]
[‘5’, ‘5’, ‘6’, ‘6’, ‘d’, ‘f’, ‘d’, ‘5’, ‘f’, ‘d’, ‘g’, ‘5’, ‘g’, ‘s’, ‘2’, ‘6’,
‘s’, ‘0’]
解释:
[1-9] 表示只匹配数字
[^0-9] 表示匹配除去数字外的字符
\w 表示匹配打个词的字符
例4:数量词
#数量词
import re
a='5566dfd5fdg5gs26s0'
r=re.findall('[a-z]{2,6}',a)
s=re.findall('[a-z]{2,6}?',a)
#贪婪 与 非贪婪
#python 默认贪婪
#非贪婪 后面加问号
print(r)
print(s)
输出:
[‘dfd’, ‘fdg’, ‘gs’]
[‘df’, ‘fd’, ‘gs’]
解释:
[a-z]{2,6} 表示只匹配连续的2到6个英文字符的子串,匹配尽可能多的连续字符 (贪婪的)
[a-z]{2,6}? 表示只匹配连续的2到6个英文字符的子串,但它是非贪婪的,所以它匹配的总是匹配最少额连续字符,总是匹配连续的2个字符 (非贪婪的)
- Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪则相反,总是尝试匹配尽可能少的字符
#数量词
#* 匹配0次或者无限次
#? 匹配0次或者1次
#+ 匹配1次或者无限次
import re
a='pytho5python4pythonn2'
r=re.findall('python?',a)
r2=re.findall('python*',a)
r3=re.findall('python+',a)
print(r)
print(r2)
print(r3)
输出:
[‘pytho’, ‘python’, ‘python’]
[‘pytho’, ‘python’, ‘pythonn’]
[‘python’, ‘pythonn’]
例5 边界匹配
#边界匹配
import re
qq='100001'
#4~8
r=re.findall('01$',qq)
print(r)
输出:
[‘01’]
解释:
01$ 表示只要字符串最后为 01 则输出01
例6 组
#组 ()
import re
a='pythonpythonpython222'
r = re.findall('(python){3}',a)
print(r)
输出:
[‘python’]
解释:
(python){3} 表示只要字符串有连续3组 python 字符串 则输出 python
例7 第三个参数
#第三个参数
import re
a='PythonC#Java'
#.号匹配任何字符包括换行符 \n
r=re.findall('C#.{1}',a,re.I)
# re.I 表示忽略大小写 re.S 表示改变.号的行为
# r=re.findall('C#.{1}',a,re.I | re.S)
print(r)
输出:
[‘C#J’]
解释:
C#.{1} 着重使用 点 字符 匹配后面任何一个字符
re.I 第三个参数就是结合 点号使用的
例8 替换
#替换
import re
a='PythonC#Java'
# 1表示只替换第一个
r = re.sub('C#','GO',a,1)
#内置函数替换
b = a.replace("C#","GO")
print(b)
print(r)
输出:
PythonGOJava
PythonGOJava
解释:
re.sub(‘C#’,‘GO’,a,1) 使用字符串 GO 替换 字符串 C# 并且只替换 a 字符串中第一个出现的 C# 子串
例9 使用函数替换操作
# 使用函数替换操作
import re
a ='Abc5566555'
#函数
def show(value):
#打印出来的是一个对象
#print(value)
#获取集体的值
matched = value.group()
if int(matched) >= 6:
return '9'
else:
return "7"
r = re.sub('65',show,a)
print(r)
输出:
Abc556955
解释:
这个逻辑比较难理解,就是字符串需要替换 65 但65又作为参数传入 show()函数中,通过一系列的操作,获取到 int 类型的65 再与 6 比较 若 65 大于等于 6 则字符串 a 中的65替换为9 反之替换为 7
例10 其他函数匹配
import re
#其他函数匹配
s = 'C55ff55566'
r = re.match('\d',s)
print(r)
#获取匹配的位置
print(r.span())
r2 = re.search('\d',s)
print(r2)
#获取值
print(r2.group())
(不知为何,本地未成功输出)
注:与 findAll() 不同之处为他们都只匹配一次
例11 较复杂组() 匹配
import re
s = 'int sdf= dfd d, python , i love java'
#使用组匹配 () ,可以多个组
r = re.findall('int(.*)python(.*)java',s)
print(r.group(1,2))
#获取全部组
print(r.groups())
(不知为何,本地未成功输出)
- 一共刚好 11 个例子 ,今天刚好 11.11