之前我剛學的python知識點,沒有題目進行熟悉,後面的知識點會有練習題,並且慢慢補充。看到很多都是很簡單的練習,碰到複雜、需要運用的再補充吧#字元串中使用到正則表達式 #字元串裡面使用的是完全匹配 ##引入正則:模糊匹配#引入例子 ##元字元(11個) . 通配符 ^尖角符(頭) $(尾) * + ...
之前我剛學的python知識點,沒有題目進行熟悉,後面的知識點會有練習題,並且慢慢補充。
看到很多都是很簡單的練習,碰到複雜、需要運用的再補充吧
#字元串中使用到正則表達式
s='hello world' print(s.find('ll')) ret=s.replace('ll','aiq') print(ret) print(s.split('o'))
#字元串裡面使用的是完全匹配
##引入正則:模糊匹配
#引入例子
import re ret=re.findall('w\w{2}l','hello world',) print(ret) # ['worl']
##元字元(11個) . 通配符 ^尖角符(頭) $(尾) * + { } [ ] \ ( ) |
#.通配符
ret=re.findall('w..l','hello world',) print(ret) # ['worl']
.表示任何東西,但一個點只能表示一位
#^ 尖角符
ret=re.findall('^w..l','hello world',) print(ret) # []
^ 只是在開頭匹配,world在開頭才能匹配
#$
ret=re.findall('w..ld$','hello world',) print(ret) # ['world']
$ 只是在末尾匹配
#*
ret=re.findall('xia.*aiq','xiawlgakwjegkawaiqweagkxiadajglagjgaaiqlskajweg') print(ret) # ['xiawlgakwjegkawaiqweagkxiadajglagjgaaiq']
* 表示重覆前面多個,包括0個,比如這裡是重覆多個‘.’
在例如:重覆多個a
ret=re.findall('ba*','uwefwoiafbaaaaaaaaaa',) print(ret) # ['xiawlgakwjegkawaiqweagkxiadajglagjgaaiq']
#+
ret=re.findall('a+b','aaaaabhweogna') print(ret) # ['aaaaab']
+表示一個以上
#?
ret=re.findall('a?b','aaaaabhweognabawegb') print(ret) # ['ab','ab','b']
?表示0或者1個
# { }
ret=re.findall('a{5}b','aaaaabjaweogldksgajaaab') print(ret) # ['aaaaab'] # {5} 表示固定的有5個 ret=re.findall('a{1,5}b','aaaaabjaweogldksgajaaab') print(ret) # ['aaaaab','aaab'] # {1,5} 表示1~5次的都可以
##. ^ $ * + ? { } 推薦使用 * + ?
##後面四個更常用
#[ ] 字元集:取消元字元的特殊功能(\ ^ -)
ret=re.findall('a[c,d]iq','aeawadiqawe',) print(ret) # ['adiq'] ret=re.findall('[a-z]','aiq') print(ret) # ['a','i','q'] ret=re.findall('[.*]','aiq') # . * 都沒有意義了 print(ret) # [] # 字元集裡面加^ ret=re.findall('[^t]','wjrttttt') print(ret) # ['w','j','r'] ret=re.findall('[^t,j]','wjrttttt') #這裡是出了't , j'的其他字元 print(ret) # ['w','r']
# \ 特殊字元被去除特殊功能,普通字元被加上特殊功能
print(re.findall('\d{11}','aweoigw12354616579 12221845651')) # ['12354616579'] print(re.findall(r'I\b','Iloveq.')) # ['I'] \b表示特殊字元 print(re.search('aiq','awekgwaeiaiqawefweaiq',)) # <_sre.SRE_Matchobject;span=(9,12),match='aiq'>
findall找字元串中全部符合的,返回一個列表
search找到第一個結果,返回一個不知道什麼類型的東西。使用.group方法可以返回找到的字元串
沒有找到不能調用.group方法
# \\ 找\
ret=re.findall('\\\\','abc\de') print(ret) # ['\\'] ret=re.findall(r'\\','abc\de') print(ret) # ['\\']
\b在python解釋器有特殊意義,加了r過後,python解釋器就不會解釋這個了
#()分組
print(re.search('(as)+','sdjasasasaswefkajasasafw').group())#asasasas ret=re.search('(?P<name>\w{2})/(?P<age>\d{2})','xq/32') # 命名分組 <?P<name> print(ret.group()) #xq/32 print(ret.group('name')) #xq print(ret.group('age')) #32
# | 管道符 代表或
print(re.search('(as)|3','as3').group()) # as ret=re.search('(?P<id>\d{3})/(?P<name>\w{3})','weeew34ttt456/qqq') # ?P<id> 這裡是自己定義一個名字 print(ret.group()) # 456/qqq print(ret.group('id')) # 456/qqq print(ret.group('name')) # qqq
使用findall方法得到的結果 [('xq', '32')]
################################################################
正則表達式的方法
1、findall():匹配的結果返回到了一個列表裡面
2、search():返回匹配到的第一個對象,可以調用group方法返回結果
3、match():只在字元開始匹配,和^號效果一樣,但是 返回對象
4、split():先按j分,然後在把分開的部分按s分
ret=re.split('[j,s]','djksal') # ****** print(ret) # ['d','k','al']
5、sub():代替
ret=re.sub('x..ui','aiq','xijuialwewejgaiq') print(ret) # aiqalwewejgaiq
6、compile():編譯了一個規則,通過規則對象
k=re.compile('\.com') ret=k.findall('afaewlj.comawelgkj') print(ret) # ['.com']
7、finditer():得到一個可迭代對象
ret=re.finditer('\d','sweg273932hk2k3jt23jk') print(next(ret).group())
#看一本書上的貪婪性匹配演算法和懶惰性匹配演算法
上面都是貪婪的
#懶惰性匹配演算法
result=re.findall('<.+>','aiq<book><title>python</title><author>jiang<author></book>ai') print(result) # 貪婪性['<book><title>python</title><author>jiang<author></book>'] result=re.findall('<.+?>','aiq<book><title>python</title><author>jiang<author></book>ai') print(result) # 懶惰性 ['<book>', '<title>', '</title>', '<author>', '<author>', '</book>']
感覺就是後面加了個問號,書上的例子都是這樣。沒錯,就是多了個?
################################################################
練習:
1、查找字元串中的6位數
result=re.findall('\d{6}','hold on 16574 153486 46514 56ef5 sa5fef 486456') print(result) # ['153486','486456']
2、中國電話號碼(0751-6228666,021-62232333,區號2-3位,後面號碼6-8位)
result=re.findall('0\d{2,3}-\d{6,8}','電話號碼:0750-6225680,姓名:qq') print(result)
3、題目:寫出正則表達式,從一個字元串中提取鏈接地址。比如
"IT面試題博客中包含很多 <a href=http://hi.baidu.com/mianshiti/blog/category/微軟面試題> 微軟面試題 </a> "
則需要提取的地址為 " http://hi.baidu.com/mianshiti/blog/category/微軟面試題 "

1 import re 2 content="IT面試題博客中包含很多<ahref=http://hi.baidu.com/mianshiti/blog/category/微軟面試題>微軟面試題</a>" 3 #result=re.search('http(s?)://(\w+(.\w+)*/(\w*)?)+',content).group() 4 #result1=re.findall('(http(s?)://(\w+(.\w+)*/(\w*)?)+)',content) 5 result=re.search('http(s?)://(\w+(.\w+)*/(\w*)?)+',content).group() 6 print(result) 7 # 標準答案 '<a(?: [^>]*)+href=([^>]*)(?: [^>]*)*>' # 這個我沒有看明白是什麼意思 8 #(http(s?)://(\w+(.\w+)*/(\w*)?)+)這樣使用findall的是[('http://hi.baidu.com/mianshiti/blog/category/微軟面試題','','hi.baidu.com/mianshiti/blog/category/微軟面試題','/category','微軟面試題')] 9 #應該是找到全部符合的,然後找小的符合的。調用search就是我想要的 10 #如果是http(s?)://(\w+(.\w+)*/(\w*)?)+這樣,就不是我想要的,可能()是分組的問題導致的View Code
4、題目:驗證電子郵箱地址

1 import re 2 x=input('輸入郵箱地址:') 3 result=re.search('^(\w)+(\.\w)*(-\w)*(_\w)*@\w+((\.\w+)+)$',x).group() 4 print(result) 5 # 答案的正則是‘^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$' ,我做的是加上答案後想了一下加的View Code
作業:
計算器
思路,先算最裡面括弧的內容,裡面可能出現加減乘除和冪運算(做成方法運算),然後結果代替原來的,迴圈。
re.search('\([^()]+\)','((3+6)*3)') # 取最裡面的括弧
1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
難度加深 2*(-15)-(-6)/(-2) 的這類
太多的東西解決不了,後期再補上,很多東西沒有學,先學其他,做好總結再說