加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

day20:正则表达式

发布时间:2020-12-20 09:56:50 所属栏目:Python 来源:网络整理
导读:单个字符的匹配 findall(正则表达式,字符串) 把符合正则表达式的字符串存在列表中返回 预定义字符集(8) d 匹配数字 D 匹配非数字 w 匹配数字字母下划线 W 匹配非数字或字母或下划线 s 匹配任意的空白符 S 匹配任意的非空白符 n 匹配一个换行符 t 匹

单个字符的匹配

findall(正则表达式,字符串) 把符合正则表达式的字符串存在列表中返回

预定义字符集(8)

d 匹配数字

D 匹配非数字

w 匹配数字字母下划线

W 匹配非数字或字母或下划线

s 匹配任意的空白符

S 匹配任意的非空白符

n 匹配一个换行符

t 匹配一个制表符

# ### 预定义字符集
# d 匹配数字
strvar = "sdfsdf*(&*(&(2ui3"
lst = re.findall(d,strvar)
print(lst)

 D 匹配非数字
strvar = D w 匹配字母数字下划线
strvar = sadf*)(*_)456你你好w W 匹配非字母或数字或下划线
strvar = W(lst)


 s 匹配任意的空白符 (n t r ' ')
strvar = "                      s S 匹配任意非空白符
strvar =     abdd                         S n 匹配一个换行符
strvar = """

"""
lst = re.findall(rn t 匹配一个制表符
strvar = """
                
tprint(lst)

字符组

必须从字符组列举出来的字符当中抽取,默认一个,如果没有返回空.

 ### 字符组[] 必须从字符组列举出来的字符当中抽取,如果没有返回空
strvar = abpoiuc[abc]print(lst)  ['a','b','c']

print(re.findall('a[abc]b',aab abb acb adb'))  aab abb acb
a[0123456789]ba1b a2b a3b acb ayb a1b a2b a3b - 代表到,代表的是范围 0-9 0到9这么多的数字
a[0-9]b'))   a-g => abcdefg
a[abcdefg]ba1b a2b a3b acb ayb adb acb adb
a[a-g]b'))      acb adb a-z => 26个小写字母
a[a-z]b acb ayb adb

 A-G => ABCDEFG
a[ABCDEFG]ba1b a2b a3b  aAb aDb aYbaAb aDb
a[A-G]baAb aDb   A-Z=> 26个大写字母
a[A-Z]baAb aDb aYb

a[0-9a-zA-Z]ba-b aab aAb aWb aqba1b aab aAb aWb aqb a1b 0-z  不会单纯的匹配小写大写字母和数字,还会匹配到特殊的符号,比如_和@
a[0-z]ba_ba@b aab aAb aWb aqba1b aab aAb aWb aqb a1b

a[0-9][*#/]ba1/b a2b a29b a56b a456ba1/b ^ 除了,在字符组当中,开头的位置使用
a[^-+*/]ba%b ccaa*bda&bd")) a%b a&b

匹配 ^ -

 如果想要匹配^ - 需要前面加上进行转义
lst = re.findall(a[^-]b",1)">a+b a-b a^b)
 ['a-b','a^b'] 

匹配 /

 匹配 
"""b 本身也是转义字符 : 退格(把光标向左移动一位)ababprint(lst[0]) 

多个字符的匹配

量词(4)

?? 0-1

+? 1-N

*? 0-N

{m,n}? M-N

 量词
'''1) ? 匹配0个或者1个a '''
a?babbzab abb aab ab b ab ab b ab
2) + 匹配1个或者多个a a+bb ab aaaaaab abb ab aaaaaab ab
3) * 匹配0个或者多个a a*bb ab aaaaaab abbbbbbb b ab aaaaaab ab b b b b b b
4) {m,n} 匹配m个至n个a  1 <= x <= 3
a{1,3}baaab ab aab abbb aaz aabb aaab ab aab ab aab {2,} 至少2次
a{2,}b aaab aab aaba{2}b aab aab aab

贪婪匹配和非贪婪匹配

1.贪婪匹配 : 默认向更多次数匹配(回溯算法)
?非贪婪匹配 : 默认向更少次数匹配

2.非贪婪匹配在量词的后面接?
例如:.?? .+? .*? {4,}?

3.回溯算法 : 从左向右进行匹配,直到匹配到最后,再也找不到了,回头,找最后一个(递归)

4.? . 匹配任意字符,除了换行符n

 练习题
strvar = 刘能和刘老根和刘铁柱子111子222

lst = re.findall(刘. ['刘能','刘老','刘铁']
(lst)

lst = re.findall(刘.?刘.+ ['刘能和刘老根和刘铁柱子111子222']
刘.*刘.{4,}子 ['刘能和刘老根和刘铁柱子111子']
 非贪婪匹配
lst = re.findall(刘.?? ['刘','刘','刘']
刘.+?刘.*? ['刘能和刘老根和刘铁柱子']
print(lst)

边界符

b 本身也是转义字符 : 退格(把光标向左移动一位)
word
右边界: db
左边界: bw

 右边界
strvar = word pwd scfdb ['d','d']
.*db  ['word pwd']
.*?db ['word',' pwd']

 左边界
lst = re.findall(rbw ['w']
bw.* ['word pwd scf']
bw.*?bw.*  ['word pwd ']
bw.*?  ['word ']

 S 匹配的是非空白符
lst = re.findall(rbwS* ['word']

^ $:开头/结尾

^ 匹配字符串的开始(必须以... 开头)
$ 匹配字符串的结尾(必须以... 结尾)
当使用^ 和 $ 符号的时候,要把字符串看成整体

strvar = 大哥大嫂大爷"
大.  ['大哥','大嫂','大爷']
^大. ['大哥']
大.$ ['大爷']
^大.$ []
^大.*?$ ['大哥大嫂大爷']
^大.*?大$^大.*?爷$ ['大哥大嫂大爷']

^g.*? giveme 1gfive gay ['giveme ']
five$aassfive'))            ['five']
^giveme$giveme'))           ['giveme']
giveme giveme'))    ['giveme','giveme']
^g.*e'))     ['giveme 1gfive']

匹配分组

 分组练习(用圆括号)
.*?_goodwusir_good alex_good secret男_good ['wusir_good',' alex_good',' secret男_good'] () 优先显示括号里面的内容
(.*?)_good ['wusir',' alex',' secret男'] ?: 取消显示括号里面的内容
(?:.*?)_good  | 代表或,a|b 匹配字符a 或者 匹配字符b . 把字符串长的写在前面,字符串短的写在后面
strvar = abcdefga|b在使用|的时候,把不容易匹配到的字符串放到前面,把容易匹配到的放到后面
strvar = abciuiuabcdwerewr
lst1 = re.findall(abc|abcd ['abc','abc']
lst2 = re.findall(abcd|abc 把不容易匹配的放到前面 ['abc','abcd']
(lst1)
print(lst2)

匹配分组练习

. 除了n,匹配所有字符
. 代表的.这个字符本身,不转义

1.小数和整数

strvar = .34 .... 78.   78.12 56.3 .3 .4 .5  匹配小数 
lst = re.findall(rd+.d+ 匹配小数和整数 
lst = re.findall(rd+.d+|d+ 分组来表达小数和整数
lst = re.findall(rd+(.d+)?(lst)

lst = re.findall(rd+(?:.d+)? ['34','78','78.12','56.3','3','4','5']

2.匹配135或171的手机号

 匹配135或171的手机号
strvar = 13566668888 17166668888(?:135|171)d{8} ['13566668888','17166668888']

 用^$卡死长度,只能是一个手机号,不能是多个
strvar = 13566668888^(?:135|171)d{8}$ ['13566668888']

3.匹配www.baidu.com 或者 www.oldboy.com

strvar = www.baidu.com www.lagou.com www.oldboy.com(?:www).(?:baidu|oldboy).(?:com) search 的用法
strvar = 
obj = re.search(rwww.(baidu|oldboy).(com) 返回的是匹配到的结果
res = obj.group()
(res)

 通过group和下标可以获取到括号的内容(了解)
print(obj.group(1))
print(obj.group(2))

 返回的是括号分组里面的内容
res = obj.groups()
print(res)

4.findall和search的区别

1.findall 是把所有符合条件的内容都匹配出来放到列表里
不能够把匹配到的结果和分组当中的内容显示在同一个界面当中
2.search 按照正则表达式,把第一次匹配到的内容返回出来,返回的是对象
能够把匹配到的结果和分组当中的内容显示在同一个界面当中
  对象.group 返回的是匹配到的结果
  对象.groups 返回的是括号分组里面的内容
  如果匹配不到内容,返回的是None,无法调用group 或者groups方法的

5."5*6-7/3" 匹配 5*6 或者 7/3 算出最后的结果

strvar = 5*6-7/3"

 匹配5*6
obj = re.search(rd+[*/]d+(obj)
strvar1 =print(strvar1,type(strvar1),1)"><===>")  5*6 <class 'str'> <===>

 计算5*6
num1,num2 = strvar1.split(*(num1,num2)
strvar2 = str(int(num1) * int(num2))
print(strvar2,type(strvar2))  "30"

 替换5*6 为字符串30
strvar3 = strvar.replace(strvar1,strvar2)
print(strvar3,type(strvar3))  30-7/3 <class 'str'>

 匹配7/3
obj = re.search(r(obj)
strvar4 =print(strvar4)  7/3

 计算7/3
num1,num2 = strvar4.split(/)
strvar5 = str(int(num1) /(strvar5,type(strvar5))

 替换7/3 为字符串2.333333333333
strvar6 = strvar3.replace(strvar4,strvar5)
(strvar6,type(strvar6))

 计算 30-2.3333333333333335 得出最后的结果
num1,num2 = strvar6.split(-)
res = float(num1) - float(num2)
print(res)

命名分组

反向引用

strvar = <div> 今天天气不错~ </div><(.*?)>(.*?)<(.*?)> [('div',' 今天天气不错~ ','/div')]

 反向引用 : 在匹配到的值,在引用一次
1 把第一个小括号里面的内容,拿出来在匹配一下'''<(.*?)>(.*?)<(/1)> 1 代表反向引用第一个括号  2代表反向引用第二个括号
strvar = a1b2cab strvar = "f1z2pfz"
obj = re.search(r(.*?)d(.*?)d(.*?)12print(obj)  <_sre.SRE_Match object; span=(0,7),match='a1b2cab'> 获取匹配到的内容
res1 =print(res1)  a1b2cab 获取分组里面的内容
res2 = obj.groups() 
print(res2)  ('a','c')

命名分组


(?P<组名>正则表达式) 给这个组起一个名字
(?P=组名) 引用之前组的名字,把该组名匹配到的内容放到当前位置
"""

 方法一
strvar = (?P<tag1>.*?)d(?P<tag2>.*?)d(?P<tag3>.*?)12(res1)
(res2)


 方法二
strvar = (?P<tag1>.*?)d(?P<tag2>.*?)d(?P<tag3>.*?)(?P=tag1)(?P=tag2)print(res2)

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读