python(七) 正则表达式

正则表达式,主要用来字符串查找,提取

正则表达式手册:https://tool.oschina.net/uploads/apidocs/jquery/regexp.html

贪婪模式:根据匹配字符串以及表达式尽可能多的进行匹配,成为贪婪匹配模式

非贪婪模式:根据匹配字符串以及表达式尽可能少的进行匹配

"""------------------------单字符(元字符):表示单个字符----------------------------------"""
import re

s1 = '1212 asasa》—_?+&%布偶'
#\d:表示一个数字,匹配一个数字字符。等价于[0-9]。
res1 = re.findall('\d',s1)
print("res1的匹配结果:",res1)

# \D: 表示一个非数字,匹配一个非数字字符。等价于[^0-9],这里是可以匹配出中文的
res2 = re.findall('\D',s1)
print("res2的匹配结果:",res2)

控制台输出:
res1的匹配结果: ['1', '2', '1', '2']
res2的匹配结果: [' ', 'a', 's', 'a', 's', 'a', '》', '—', '_', '?', '+', '&', '%', '布', '偶']

# \s :表示一个空白字符
res3 = re.findall('\s', s1)
print("res3的匹配结果:",res3)

# \S :表示一个非空白字符
res4 = re.findall('\S', s1)
print("res4的匹配结果:",res4)

控制台输出:
res3的匹配结果: [' ']
res4的匹配结果: ['1', '2', '1', '2', 'a', 's', 'a', 's', 'a', '》', '—', '_', '?', '+', '&', '%', '布', '偶']

# \w :表示一个单词字符(数字、字母、下划线),匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。
res5 = re.findall('\w', s1)
print("res5的匹配结果:",res5)

# \W :表示一个非单词字符(除数字、字母、下划线之外的所有字符)
res6 = re.findall('\W', s1)
print("res6的匹配结果:",res6)

控制台输出:
res5的匹配结果: ['1', '2', '1', '2', 'a', 's', 'a', 's', 'a', '_', '布', '偶']
res6的匹配结果: [' ', '》', '—', '?', '+', '&', '%']

""" . :表示任意字符(通配符) 	匹配除“\n”之外的任何单个字符"""
# res7 = re.findall('.', s1)

# [] :匹配列举的单字符
s2 = '01335abfgAZ09zh?.,;[&^$*#'
res8 = re.findall('[ac23]', s2) # 匹配出包含中括号里面的字符
print("res8的匹配结果:",res8)

res9 = re.findall('[0-9a-zA-Z]', s2) # 此三个范围的全部字符都匹配出来
print("res9的匹配结果:",res9)

res10 = re.findall('[0-9]', s2) # 只匹配0到9的数字字符
print("res10的匹配结果:",res10)

控制台输出:
res8的匹配结果: ['3', '3', 'a']
res9的匹配结果: ['0', '1', '3', '3', '5', 'a', 'b', 'f', 'g', 'A', 'Z', '0', '9', 'z', 'h']
res10的匹配结果: ['0', '1', '3', '3', '5', '0', '9']

# 匹配中文(扩展了解)
s3 = '你是123asasa'
res11 = re.findall('[\u4e00-\u9fa5]',s3)
print(res11)

控制台输出:
['你', '是']

"""------------------------表示数量----------------------------------"""
# {n}:表示前一个字符出现n次
s1 = '1234aanca112233.1234466'
res1 = re.findall('\d{4}', s1) # 等同于  re.findall('\d\d\d\d\d',s1)
print("res1匹配结果:",res1)

# {n,}:表示前一个字符出现n次以上
s2 = '1234aanca112233.1234466YY12345678'
res2 = re.findall('\d{4,}', s2)
print("res2匹配结果:",res2)

# {n,m}:表示前一个字符出现n到m次
s3 = '123aa1234bb12345cc123456bb1234567890111111'
res3 = re.findall('\d{4,6}', s3) #-------贪婪模式
print("res3匹配结果:",res3)
res4 = re.findall('\d{4,6}?', s3) # -------关闭贪婪模式
print("res4匹配结果:",res4)

控制台输出:
res1匹配结果: ['1234', '1122', '1234']
res2匹配结果: ['1234', '112233', '1234466', '12345678']
res3匹配结果: ['1234', '12345', '123456', '123456', '789011', '1111']
res4匹配结果: ['1234', '1234', '1234', '1234', '5678', '9011', '1111']


#----------------------------------------贪婪模式----------------
# 默认是开启贪婪模式去进行匹配的,贪婪模式关闭:表示数量范围的后面加上?
# 关闭贪婪模式的应用
s = '{"id": "#id#", "name": "#name#", "data": "#data#", "title": "#title#", "aaa": 11, "bbb": 222}'
res5 = re.findall("#.{1,}?#",s)
res6 = re.findall("#.{3,}?#",s)
print("res5匹配结果:",res5)
print("res6匹配结果:",res6)

控制台输出:
res5匹配结果: ['#id#', '#name#', '#data#', '#title#']
res6匹配结果: ['#id#", "name": "#', '#", "data": "#', '#", "title": "#']

"""---------------------------"""
# + :表示一次以上  ====>等同于 {1,}  	匹配前面的子表达式一次或多次
s = '{"id": "#id#", "name": "#name#", "data": "#data#", "title": "#title#", "aaa": 11}'
res7 = re.findall("#.{1,}?#",s)
res8 = re.findall("#.+?#",s)
print("res7匹配结果:",res7)
print("res8匹配结果:",res8)

# * :表示0次以上  ====>等同于 {0,} 匹配前面的子表达式零次或多次
s1 = '123abc'
res9 = re.findall('\d*',s1)
print("res9匹配结果:",res9)

# ? 匹配前面的子表达式零次或一次
res10 = re.findall('\d?',s1)
print("res10匹配结果:",res10)

控制台输出结果:
res7匹配结果: ['#id#', '#name#', '#data#', '#title#']
res8匹配结果: ['#id#', '#name#', '#data#', '#title#']
res9匹配结果: ['123', '', '', '', ''] #多个空格的原因是最后找不到就结束了,找不到就显示空格
res10匹配结果: ['1', '2', '3', '', '', '', '']

################################################################################
s = '{"id": "##", "name": "#name#", "data": "#data#", "title": "#title#", "aaa": 11, "bbb": 222}'
res11 = re.findall("#.+?#",s)
print("res11匹配结果:",res11)

res12 = re.findall("#.*?#",s)
print("res12匹配结果:",res12)

控制台输出:
res11匹配结果: ['##", "name": "#', '#", "data": "#', '#", "title": "#']
res12匹配结果: ['##', '#name#', '#data#', '#title#']
"""
表示边界

字符串边界:
    ^ :表示字符串的开头(起始位置)
    $ :表示字符串的结尾(终止位置)
单词边界:
    \b :表示单词边界
    \B :表示非单词边界    
"""
import re
# ------------------------表示边界----------------------------------
s  = "123123python456java123c++123"
# ^ :表示字符串的开头(起始位置)
res = re.findall('^123',s)
print("res匹配结果:",res)

# $ :表示字符串的结尾(终止位置)
res1 = re.findall('123$',s)
print("res1匹配结果:",res1)

res2 = re.findall('12$',s)
print("res2匹配结果:",res2)

控制台输出:
res匹配结果: ['123']
res1匹配结果: ['123']
res2匹配结果: []


# \b: 表示单词边界
s = 'python ispython! good?java'
res3 = re.findall(r'python\b',s)
print("res3匹配结果:",res3)

res4 = re.findall(r'\bpython',s)
print("res4匹配结果:",res4)


# \B  表示非单词边界
s = 'pythonm ispython99 good?java'
res5 = re.findall(r'python\B',s)
print("res5匹配结果:",res5)

s6 = 'ispython99 good?java'
res6 = re.findall(r'\Bpython',s6)
print("res6匹配结果:",res6)

控制台输出:
res3匹配结果: ['python', 'python']
res4匹配结果: ['python']
res5匹配结果: ['python', 'python']
res6匹配结果: ['python']

# 注意点:
# python中\b是一个转义字符----->表示键盘上的backspace
"""
表示分组

():分组提取

 | :表示个多匹配规则

"""
# --------------()分组提取------------------
s = '{"id": "#id#", "name": "#name#", "data": "#data#", "title": "#title#", "aaa": 11, "bbb": 222}'
res = re.findall('#(.+?)#',s)
print("res匹配结果:",res)

s2 = "i7o8uhoinjgvhj****BBBaa123aa-aa678aa-aa789aaBBB*****567890p6dtuybhsadfgshj"
res2 = re.findall('aa(.+?)aa',s2)
print("res2匹配结果:",res2)

控制台输出:
res匹配结果: ['id', 'name', 'data', 'title']
res2匹配结果: ['123', '678', '789']

# -------------------------| 表示个多匹配规则------------------
s = '123456python345java0000'
res3 = re.findall('python|java',s)
print("res3匹配结果:",res3)

s2 = 'aaa@python@sasas#java#add'
res4 = re.findall('@.+?@|#.+?#', s2)
print("res4匹配结果:",res4)

res5 = re.findall('@(.+?)@|#(.+?)#', s2)
print("res5匹配结果:",res5)

控制台输出:
res3匹配结果: ['python', 'java']
res4匹配结果: ['@python@', '#java#']
res5匹配结果: [('python', ''), ('', 'java')]


# -----扩展了解即可---

s3 = "fyuvibnpms#user=lemonban-pwd=1234-sign=kkkkk#adgvahskml/#user=python-pwd=6666-sign=vvvvv#vhbjnkm"
res6 = re.findall('#user=(.+?)-pwd=(.+?)-sign=.+?#', s3)
print("res6匹配结果:",res6)

s3 = "fyuvibnpms#user=lemonban-pwd=1234#adgvahskml/#user=python-pwd=6666#vhbjnkm"
res7 = re.search(r'#user=(.+?)-pwd=(.+?)#',s3)
print("res7匹配结果:",res7.group(2))

控制台输出:
res6匹配结果: [('lemonban', '1234'), ('python', '6666')]
res7匹配结果: 1234
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值