正则表达式

正则表达式

正则表达式是为了实现serach和match,即检索和匹配,和我们密切相关的就是搜索引擎,大量的运用正则表达式来匹配字符串,按照我的理解,我们在搜索框内输入的就是一个正则表达式,然后引擎获取正则表达式进行匹配然后输出匹配好的结果,相似度高的在前面,低的在后面,我们之前匹配字符串经常使用的方法是if语句和列表表达式

列表表达式

例如我们要求将列表内开头两个字母是py的字符串检索出来,我们就可以使用列表表达式

list2=["pyrha","pyhaida","pyhdja","bsfs","adada"]
list3=[i for i in list2 if i[0:2]=="py"]
print(list3)
结果:['pyrha', 'pyhaida', 'pyhdja']

但是一旦遇到复杂的情况,使用列表表达式和if语句就会非常的繁琐
比如,我们要求将字符串内的数字提取出来到列表内
str1=“ada5d4a32d1a3d4a5d4”
python的正则表达式是非常强大的,所以我们要学习在正则表达式

举个例子

s1="tim"
s2="tom"
s3="tiiioioiioimeeeeeeee"
m=r't[io]+m'
print(re.match(m,s3).group(0))

我的目的是检索出s1,s2,s3,我们运用正则表达式可以检索到所有符合要求的即开头是t结尾是m中间只有i和o的字符串,所以检索出是,想,s1,s2和s3的部分

match该方法可以从字符串的起始位置检索一个字符串,如果匹配成功就返回一个match对象,如果不匹配返回none
group(0)方法返回匹配的整个字符串,span用来以元祖形式返回一个字符串,意思就相当于转义字符,字符串是什么样子就返回什么样子,里面的/之类的符号不会被识别

在一个例子,我们要求匹配只由数字组成的字符串,那么我们回见到两个新面孔,^和$,这个一个匹配行首,一个匹配行尾,然后我们中间加上限制条件

m=r'^[0123456789]+$'
    print(re.match(m,"1278451342adada4587").group(0))

当然这个字符串是不可以被匹配成功的,因为不是只由数字组成的,运行后会报错

File "E:/untitled/P2019_9_9.py", line 17, in <module>
    print(re.match(m,"1278451342adada4587").group(0))
AttributeError: 'NoneType' object has no attribute 'group'

注意的是,正则表达式是针对字符串的,就算你要检索数字也要把数字用双引号括住
当然,我们可以吧上个例子的正则表达式进行简化,写成

m=r'^[0-9]+$',当要求是检索字母的时候,也可以写为m=r'^[a-zA-Z]+$'

正则表达式非常丰富,接下来我一一配合代码列举

特殊字符

  1. .和{m,n}和{m,n}?
    例如,我想任意匹配五个字符,这个时候可以用.和{m}?来搭配
    m3=r’.{5}’
    print(re.match(m3,“1278451342adada4587”).group(0))
    结果返回12784

正则表达式内的.代表匹配任意字符除了\n,而{5}代表将上一个模式匹配5次,当然花括号内大部分情况是两个参数即m和n,表示将最少匹配m个最多匹配n个,是贪心模式,也可以在花括号后面加一个问号,表示不执行贪心算法,意思是最多匹配m个,就算后面的符合要求也不会匹配,因为不执行贪心算法

2.‘*’用于将前面的模式匹配0次或多次(贪婪模式,即尽可能多的匹配)
‘+’用于将前面的模式匹配1次或多次(贪婪模式)
‘?’用于将前面的模式匹配0次或1次(贪婪模式)
在这三个特殊字符后加括号都会取消贪婪算法
3.
转义字符,会取消其后的特殊字符的意义,比如你要匹配加好或者问号,可以在前面加上转义字符,那样子就不会被当作特殊字符
4.[]
用于表示一个字符集,会匹配括号内的字符集,比如[0-9],如果在里面加上【^0-9】就代表匹配字符集是0-9以外的字符,即转换为补集
5.|
代表或的关系,比如a|b代表匹配a或者b

转义字符

\A:表示从字符串的开始处匹配
\Z:表示从字符串的结束处匹配,如果存在换行,只匹配到换行前的结束字符串。
\b:匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘py\b’ 可以匹配"python" 中的 ‘py’,但不能匹配 “openpyxl” 中的 ‘py’。
\B:匹配非单词边界。 ‘py\b’ 可以匹配"openpyxl" 中的 ‘py’,但不能匹配"python" 中的 ‘py’。
\d:匹配任意数字,等价于 [0-9]。
\D:匹配任意非数字字符,等价于 [^\d]。
\s:匹配任意空白字符,等价于 [\t\n\r\f]。
\S:匹配任意非空白字符,等价于 [^\s]。
\w:匹配任意字母数字及下划线,等价于[a-zA-Z0-9_]。
\W:匹配任意非字母数字及下划线,等价于[^\w]
\:匹配原义的反斜杠\。

re模块内的方法

match(pattern,string,flag)

pattern代表的是正则表达式,string代表要匹配的表达式,flag代表标志位,用来控制正则表达式的匹配方式,如是否区分大小写,多行匹配

serach,fullmatch

这两个方法的参数和match类似,但是三者都有区别,match是从字符串开始进行匹配,如果开头就不符合那么匹配中断返回none,search方法是从字符串开头一直向后寻找直到找到了符合要求的字符串然后返回,如果遍历到最后没有找到返回none,fullmatch是最极端的,它要求整个字符串都符合要求,否则就返回none
例如

string="hi you know?HJL is 21 years old,he is a nice boy"
m4=r'(\w+) is (\d{1,3}) years old,he is a nice (\w+)'
print(re.search(m4,string).group())

结果:HJL is 21 years old,he is a nice boy

如果用其他两个方法都会返回none
这里我们可以发现我们需要检索出来的主要数据是name,age,sex,所以我们可以为检索出来的这三个字符串分组
我们将上述的正则表达式修改为

m4=r'(?P<name>\w+) is (?P<age>\d{1,3}) years old,he is a nice (?P<sex>\w+)'
mat=re.search(m4,string)
print(mat.group('name'))
print(mat.group('age'))
print(mat.group('sex'))

然后输出的结果就会是我们希望看到的

HJL
21
boy
sub(pattern,repl,string,count=0,flags=0)和subn

这两个方法是进行匹配然后替换的,用repl替换掉与正则表达式相匹配的子串,其中repl可以是字符串也可以是返回字符串的函数
例如:删除字符串内的全部数字

m5=r'\d+'
print(re.sub(m5,"","454a5d4a5d7a8d4"))
结果:adadad

与match匹配模式不同的是,match只要遇见了不符合的就不会继续,而search遇到了合适的就会停止匹配,但是sub会一直匹配下去,找出所有符合正则表达式的然后进行替换
subn与sub相比,在返回值加上了匹配的次数

split(pattern,string,maxsplit=0,flages)

split会通过匹配的字符串对原字符串进行分割,分割后的子串将会以列表的形式返回,maxsplt表示分割的次数,默认是0代表不限次数

print(re.split(m5,"aa454a5d4a5d7a8d4"))
结果:['aa', 'a', 'd', 'a', 'd', 'a', 'd', '']
findall和finditer方法

findall方法和search很像,只不过search检索到第一个匹配的就会停止检索,但是findall会一直检索到最后,并且去除重复的匹配字段,以列表形式返回所有结果

string="hi you know?HJL is 21 years old,he is a nice boy,good byebye,YZY is 21 years old,he is a nice girl"
m4=r'(?P<name>\w+) is (?P<age>\d{1,3}) years old,he is a nice (?P<sex>\w+)'
mat=re.findall(m4,string)
print(mat)
结果:[('HJL', '21', 'boy'), ('YZY', '21', 'girl')]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值