正则表达式

正则表达式

  • 正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。

  • 正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

Python中处理正则表达式:

import re

# 单字符的表示规则
# ----------------findall方法 - -----------------
# .:表示除\n外的任何一个字符
re1 = r'.'
res1 = re.findall(re1, 'hjbgaihu15964156sdhugiosdhg')
print(res1)

# []:举例一个字符
re2 = r'[abc]'
res2 = re.findall(re2, 'abihaubhoisshfu84sd48sd4b')
print(res2)

# \d:表示一个数字
re3 = r'\d'
res3 = re.findall(re3, 'dsad41sags4g7sa4gs4g5s4gdg')
print(res3)

# \D:表示一个非数字
re4 = r'\D'
res4 = re.findall(re4, 'sdad45s5agasgihuh#$4')
print(res4)

# \s:表示一个空白键
re5 = r'\s'
res5 = re.findall(re5, 'iaj ioad nj54   dsa575')
print(res5)

# \S:表示非空白键
re6 = r'\S'
res6 = re.findall(re6, 'dsa 46sd s54ad4ds5a')
print(res6)

# \w:表示一个单词(单词组成:数字,字母,下划线)字符
re7 = r'\w'
res7 = re.findall(re7, 'nsa@$$% 65846 SOAHH,//"')
print(res7)

# \W:表示一个非单词字符(不是数字,字母,下划线)
re8 = r'\W'
res8 = re.findall(re8, '#%^fdsaf5445,.?":')
print(res8)

# 二:多个字符的匹配规则

re21 = r'abc'
res21 = re.findall(re21, 'hjbgfkaabc5684564abcigjfkahsug')
print(res21)

# |:同时定义多个规则
re22 = r'13355|15555'
res22 = re.findall(re22, 'sd1335598das15555dsaga879856')
print(res22)

# 匹配手机号11位
# {m}:表示匹配一个字符m次
re23 = r'1[3456879]\d{9}'  # 匹配1开头,第二位数字是3-9,最后是9位数字的字符
res23 = re.findall(re23, 'sda1351256165151dsagag14548451515411gag451445444658454')
print(res23)

# {m,}:表示匹配一个字符至少m次
re24 = r'\d{7,}'
res24 = re.findall(re24, 'andhuiaf5461513das5s161a65g1a5s61g56as16515616516')
print(res24)

# {m,n}:表示匹配一个字符出现m次到n次
# 默认开启贪婪模式:如果给定一个范围,它会尽可能的去匹配更多的
re25 = r'\d{3,5}'
res25 = re.findall(re25, 'aaaaa123456ghj333yyy77iii88jj909768876')
print(res25)

# 关闭贪婪模式:在给定的范围后面加个问号(变成非贪婪模式,尽可能匹配最少的)
re26 = r'\d{3,5}?'
res26 = re.findall(re26, 'aaaaa123456ghj333yyy77iii88jj909768876')
print(res26)

# *:表示前一个字符出现0次以上(包括0次)
re27 = r'\d*'
res27 = re.findall(re27, '343aa1112df345g1h6699')
print(res27)

# +:表示前一个字符出现1次以上,(包括1次)
re28 = r'\d+'
res28 = re.findall(re28, '343aa1112df345g1h6699')
print(res28)

# ?:表示0次或者1次
re29 = r'\d?'
res29 = re.findall(re29, '343aa1112df345g1h6699')
print(res29)

# 三:边界匹配
# ^:匹配字符串的开头
re31 = r'^python'
res31 = re.findall(re31, 'python66624python')
print(res31)

# $:匹配字符串的结尾
re32 = r'python$'
res32 = re.findall(re32, 'python66624python')
print(res32)

# \b:匹配字符串的边界
re33 = r'\bpython'
res33 = re.findall(re33, 'python66624python')
print(res33)

# \B:匹配字符串的非边界
re34 = r'\Bpython'
res34 = re.findall(re34, 'python66624python')
print(res34)

# ():匹配分组:在匹配的数据中提取数据
re35 = r'aa(\d{3})bb'
res35 = re.findall(re35, 'gg21111h2222hj333klg444hj555klghjkaa123bbhhjhjjaa345bb')
print(res35)

re36 = r"aa(\d{2,})bb(\d{2,})cc"
res36 = re.findall(re36, "aa123bb345cc7890ghjkl78aa22bb33cc")
print(res36)

# ------------------------search方法 - ------------------------------
# search: 查找第一个符合规范的字符串,返回出来的是一个匹配对象
s = '123abc123aaa123bbb888ccc'
res41 = re.search(r'123', s)
# 通过group能够将找到的数据提取出来
print(res41.group())

# 如果没有找到符合规范数据,返回的就是一个None
re3 = re.search(r"345", s)
print(re3)

re4 = r"aaa(\d{3})bbb(\d{3})ccc"
res4 = re.search(re4, s)
print(res4)
# 使用search,按规则查找,提取分组的数据:使用group方法,
# group不传参数:获取的是匹配到的所有内容
# group可以通过参数来指定,获取第几个分组中的内容(获取第一个分组,传入参数1,获取第二个分组,传入参数2。。。。。。。)

print(res4.group(1))
print(res4.group(2))

# ----------------------match------------

s = "a123abc123aaa123bbb888ccc"

# match:字符串的开头位置进行匹配,找到符合规范的,返回出来的是一个匹配对象
# 如果开头的位置不符合规范,那么不会忘后面去找,直接返回的是None
res1 = re.match(r"a123abc", s)
print(res1)

# -------------替换-----------------------
s = "a123abc123aaa123bbb888ccc"
# """
# 第一个参数:待替换的字符串
# 第二个参数:目标字符串
# 第三个参数:要进行替换操作的字符串
# 第四个参数:可以指定最多替换的次数,非必填(默认替换所有符合规范的字符串)
#
# """
res5 = re.sub(r'123', "666", s, 4)
print(res5)
posted @ 2020-06-23 15:11  搬砖工周某  阅读(189)  评论(0编辑  收藏  举报