python 的正则表达式

一、正则之入门(re、compile、pattern、search、match、span、group、groups)

import re

msg='津巴布韦迪丽热巴阿里巴巴地理爸爸,迪丽热巴'
pattern=re.compile('迪丽热巴') 

result=pattern.match(msg)  #match从头匹配若头部匹配不上直接返回None不继续后面匹配
#若匹配上返回范围 <re.Match object; span=(0, 4), match='迪丽热巴'>
print(result) #None

result=pattern.search(msg) 
print(result)  #<re.Match object; span=(4, 8), match='迪丽热巴'>


#真正的正则模块,直接调用match,pattern已被封装好
#re.match(pattern, string)
result=re.match('阿里巴巴',msg)
print(result) #None
result=re.search('迪丽热巴',msg) #search能够进行搜索但搜寻到一个后便退出
print(result) #<re.Match object; span=(4, 8), match='迪丽热巴'>

#结果还是一样的,操作更简便

#span是匹配的位置,也可以通过result.span()来取位置

result1=result.span()
print(result1) #(4, 8)

#group 是匹配的内容,可通过result.group()来获取内容
result2=result.group()
print(result2)   #迪丽热巴

二、正则之次数(findall及正则符号)

'''
正则的符号:

'.'用于匹配除换行符以外的所有字符
'^'用于匹配字符串的开始,即行首
'$'用于匹配字符串的末尾(末尾如果有换行符\n,则匹配\n前的字符),即行尾

'?'用于将前面的模式匹配 0次或1次(贪婪模式)
'+'用于将前面的模式匹配 1次或多次(贪婪模式)
'*'用于将前面的模式匹配 0次或多次(贪婪模式即尽可能多的匹配)
'*?' '+?' '??'即上面的非贪婪模式(尽可能少的匹配)。
'{m,n}'用于将前面的模式匹配 m到n次(贪婪模式),即最小匹配m次,最多匹配n次
'{m,n}?'即上面的非贪婪版本
'{m}'用于将前面的模式匹配 m次

'[]'用于标识一组字符,如果^是第一个字符,则标识的是一个补集,比如[0-9]表示所有数字,
[^0-9]表示除了数字外的字符

'|'比如A|B用于匹配A或B
'(...)'用于匹配括号中的模式,可以在字符串中检索或匹配我们所需要的内容
'''
import re
msg='abcd786vjkf11d81h2df003k'
#要匹配a6b这样的字母数字字母的形式

result=re.findall('[a-z][0-9][a-z]',msg) #搜寻多个结果用findall方法,
#返回的直接是要匹配的多个值。列表
print(result)  #['d7v', 'd8h']

#a77b a7n a786k都符合需求

result1=re.findall('[a-z][0-9]+[a-z]',msg)
print(result1) #['d786v', 'f11d', 'h2d', 'f003k']

#qq号码的验证
qq=input('你的qq号码:')
result2=re.match('^[1-9][0-9]{4,11}$',qq)    #首位不能是1,后面4-11位,总共5-12位
#开头结尾都要用符号限定,代表是整个整体比较
print(result2)

三、python正则之预定义

'''
作者:10194
日期:2021年06月05日16时45分34秒
'''

#用户名可以是字母或者数字,不能是数字开头,用户名长度必须6位以上[0-9a-zA-z]
import re
# user=input('请输入用户名:')
# result=re.match('^[a-zA-Z][0-9a-zA-Z]{5,}$',user)
# print(result)

#用户名可以是字母数字下划线,[0-9a-zA-Z_]那是不是写起来太麻烦了

'''
\w=[0-9a-zA-Z_]
\W=[^\w]
\A:从字符串开始匹配
\Z:从字符串的结束处开始匹配,如果存在换行,只匹配换行前的结束字符串
\b:匹配一个单词的边界,也就是指单词与空格之间的位置。例如 'py\b'可以匹配'python'中的'py',但不能匹配‘openpyxl’中的py。
\B:匹配一个单词的非边界,与上例相反
\d:匹配任意数字,等价于[0-9]
\D:匹配任意非数字,等价于[^\d]
\s:匹配任意空白字符,等价于[\t\n\r\f]
\S:匹配任意非空白字符,等价于[^\s]
\w:匹配任意字母数字下划线
\W:匹配任意非数字字母下划线
\\:匹配原意的反斜杠\。
'.'用于匹配除换行符外的所有字符

'''

msg='aa.py ab.txt bb.py cc.png a*py'

result=re.findall(r'\w+[.]py\b',msg)   #['aa.py', 'bb.py']
# #转义字符中是有\b的所以要消除转义,保留原格式
print(result)

四、正则之分组

正则表达式的分组:

1. |表示或可用于整组的不同项匹配,

2. ()表示分组,可匹配一连串的字符或连续的数字而之前用到的[ ]只能匹配单个字符。

3. \Z可从后匹配

4. 要提取匹配的分组时可用 re.group(组号)

5. 在匹配标签时可用,会有前后标签匹配的应用,可用数字引用之前的分组,如代码段底部,可用\1(\数字)来使用之前的分组,而有多个嵌套标签时,后标签的引用数字是倒叙的如一般<html><html></html></html>时,正则匹配时是</2></1>.

'''
作者:10194
日期:2021年06月05日21时47分30秒
'''

#分组   | () \Z  提取 groups() group(1)第一组 group(2)第二组  一个括号就是一组

#匹配数字0-100数字

import re
n=input('数字:')
result=re.match(r'[1-9]?\d',n)
print(result)

#改进版   用到的符号:|或者
result=re.match(r'[1-9]?\d?$|100$',n)   #|是或的意思,要么用前面的要么用后面的
print(result)

#验证输入的邮箱 163 126 qq  用到的符号:() 配合|使用,代表整体的匹配,[]代表的是单个字符的匹配
email=input('邮箱')
r1=re.match(r'.+@(163|126|qq)\.(com|cn)$',email) #
print(r1)

#(163)代表的是整个单词,[163]代表的是1或者6或者3的一个数字。

#不是以4、7结尾的手机号码
phone=input('手机号码:')
r2=re.match(r'\d{10}[^47]\Z',phone)
print(r2)

#爬虫 提取区号和电话号码
phone='010-123456789'
r3=re.match(r'(\d{3}|\d{4})-(\d{8})',phone)
print(r3.groups())  #('010', '12345678')
print(r3.groups()[1]) #12345678
print(r3.group(1))   #010  第一组的内容 一个组就是一组

#爬到一个标签要拿到标签里的东西
msg='<html>abc</html>'
msg1='<h1>hello</h1>'
r4=re.match(r'(<\w+>)(.*)(</\w+>)$',msg1)
print(r4.group(2))

#改进  使用数字调用之前的分组
re4=re.match(r'<(\w+)>(.*)</1>$',msg1) #数字可以用于引用之前的分组,
# 这里的1就是把第1个分组拿过来了 ,如果出错,可以加一个写作\1,
#这么做的好处是可以保证写的标签前后正确,若不匹配就不能正确匹配。
print(r4.group(1))
print(r4.group(3)) #</h1>

#嵌套标签时后面的调用的组数是倒着来的
msg='<html><h1>abc</h1></html>'
r5=re.match(r'<(\w+)><(\w+)>(.+)</\2></\1>$',msg) #<re.Match object; span=(0, 25), match='<html><h1>abc</h1></html>'>
print(r5)
#在字符串中有.和要引用分组时,要加\


五、正则表达式其他函数

上面的数字分组存在一定的缺点,当标签过多时,会出现混乱,不知道用的是哪个正则标签,此时可以使用另一种起名方式:?P<名字>正则  (?P=名字)

import re

msg='<html><h1>abc</h1></html>'

result=re.match(r'<(?P<标签1>\w)><(?P<标签2>\w)>(.+)</(?P=标签2)><?P=标签1>',msg)

print(result)

re.sub(pattern,want to sub,msg)函数可以将字符串中想要替换的字符进行想要的替换,并且可以通过传入方法的形式,对原字符串进行逻辑上的修改

#简单示例

msg='java:99,python:90'

import re

result=re.sub(r'\d+','90',msg)

print(result)

#方法形式的替换

def func(temp):
    num=temp.group()
    num1=int(num)+1
    return str(num1)

result=re.sub(r'\d+',func,msg)

print(result)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值