python_字符串&正則表達式


 

正則表達式: 1.字符串模糊匹配,2.字符串有條件匹配

 

Re.match() 從開頭開始匹配的

Re.match().group(), 得到匹配結果

Re.search() 從中間開始匹配,只匹配一次就返回

Re.findall() 找到所有的符合的條件,結果放在一個列表中

 “$” 符號匹配的是  字符串最后一個字符,目標字符串是以 $前面的字符結尾

re.split()  以匹配的內容作為分割符

re.sub()  替換字符串中符合條件的匹配項 

 

import re

str = "yangguo8890long110"
res = re.match("yangguo\d",str)   #match 必須從開頭開始匹配
result = res.group()   #得到匹配結果
print(result)

    #1 '.' 默認匹配除\n之外的任意一個字符,若指定flag DOTALL,則匹配任意字符,包括換行
res1 = re.match("^.","yangguo8890long110")
print(res1)
print(res1.group())
res1 = re.match("yang.","yangguo8890long110")
print("1",res1)    #<_sre.SRE_Match object; span=(0, 5), match='yangg'>

    #2 '^' 匹配字符開頭,以某個字符開頭,可以指定flags MULTILINE,
res2 = re.match("^yangguo\d","yangguo8890long110")
print(res2) #<_sre.SRE_Match object; span=(0, 8), match='yangguo8'>

    # 3'$'     匹配的目標字符串 str 必須以$前面的字符結尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
res3 = re.search("l.+0$","yangguo8890long120")
print("3",res3)   #3 <_sre.SRE_Match object; span=(11, 18), match='long120'>
res3 = re.search("l.+1$","yangguo8890long120")
print("3",res3)   #3 None

    # 4'*'     匹配*號前的字符0次或多次,re.findall("ab*","cabb3abcbbac")  結果為['abb', 'ab', 'a']  #表示*前面的b是可有可無的,但a必須存在
    # 5'+'     匹配前一個字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 結果['ab', 'abb']          #表示+前面的必須以ab開頭,b可有多個
res5 = re.search("l[a-z]+g","yangguo8890longnv1208")   #可以表示以某個字符結束
print(res5)  #<_sre.SRE_Match object; span=(11, 15), match='long'>
res5 = re.search("998.+998","yang 998guoxiao998 .s")  #匹配 998中間的字符,表示以 *開頭,以* 結尾
print(res5) #<_sre.SRE_Match object; span=(5, 18), match='998guoxiao998'>
# 6'?' 匹配?前面的一個字符1次或0次 res6 = re.search("889?","yannngguang889huan") print(res6)#<_sre.SRE_Match object; span=(11, 14), match='889'> res6 = re.search("889?","yannngguang88huan")#?前面的一個字符可以不匹配 print(res6)#<_sre.SRE_Match object; span=(11, 13), match='88'> res6 = re.search("889?","yannngguang8huan") print(res6)#None
#
7'{m}' 匹配前一個字符m次 res7 = re.search("[0-9]{3}","ya4nn1n5gg6ua7ng892huan") #匹配連續的三個數字 print(res7)#<_sre.SRE_Match object; span=(16, 19), match='892'>
# 8'{n,m}' 匹配前一個字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 結果'abb', 'ab', 'abb'] res8 = re.search("[0-9]{2,3}","ya4nn1n5gg6ua17ng892huan") #匹配連續的兩個數字或者連續的三個數字 print(res8)#<_sre.SRE_Match object; span=(13, 15), match='17'> res8 = re.findall("[0-9]{1,3}","ya4nn1n5gg6ua17ng892huan") #匹配所有的數字,最多三位 print(res8)#['4', '1', '5', '6', '17', '892']
#
9'|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 結果'ABC' res9 = re.search("123|abc","uyunjabckih123") print(res9)
#
10'(...)' 分組匹配,把括號里的字符看做一個整體,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 結果 abcabca456c res10 = re.search("(123){2}.+(i){2}","yuhiinyi123123iyhii321")#匹配123 兩次 print(res10) # 11'\A' 只從字符開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的 # 12'\Z' 匹配字符結尾,同$ # 13'\d' 匹配數字0-9 # 14'\D' 匹配非數字 res14 = re.search("\D+","234HKJU98+()") print(res14) #<_sre.SRE_Match object; span=(3, 7), match='HKJU'> res14 = re.findall("\D+","234HKJU98+()") print(res14)#['HKJU', '+()'] # 15'\w' 匹配[A-Za-z0-9] # 16'\W' 匹配非[A-Za-z0-9] # 17'\s' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 '\t' #18'[a-z]' 匹配所有小寫字母一次 #19'[A-Z]' 匹配所有大寫字母一次 #20'[a-zA-Z]' 匹配所有寫字母一次,不分大小寫

2. 分組匹配,可有將匹配的字符直接轉換成字典

    groupdict()方法

a = re.search("(?P<province>[0-9]{2})(?P<city>[0-9]{2})(?P<town>[0-9]{2})(?P<birthday>[0-9]{8})","511243199802241714").groupdict()
print(a) #{'province': '51', 'city': '12', 'town': '43', 'birthday': '19980224'}
#?P 為語法定義,P為大寫,在<>中放入字典的鍵,后面為匹配的內容

 

3. re.split() #以匹配的內容作為分割符,生成一個列表

s1 = re.split("[a-z]","123abc78ab9cdeg00t8")
print(s1)#['123', '', '', '78', '', '9', '', '', '', '00', '8']
s2 = re.split("[a-z]+","123abc78ab9cdeg00t8")
print(s2)#['123', '78', '9', '00', '8']

4.re.sub() 替換字符串中符合條件的匹配項 

s3 = re.sub("[a-z]+","$","123abc78ab9cdeg00t8") #將所有字符替換成$
print(s3)#123$78$9$00$8
s4 = re.sub("[a-z]+","$","123abc78ab9cdeg00t8",count = 3) #將字符替換成$,替換3 次
print(s4)#123$78$9$00$8

5,改變匹配模式

re.I(re.IGNORECASE): 忽略大小寫
re.M(MULTILINE): 多行模式,改變'^'和'$'的行為
re.S(DOTALL): 點任意匹配模式,改變'.'的行為,可有匹配換行
# re.I(re.IGNORECASE): 忽略大小寫(括號內是完整寫法,下同)
r = re.search("[a-z]+","adTYHad")
print(r)#<_sre.SRE_Match object; span=(0, 2), match='ad'>
rf = re.search("[a-z]+","adTYHad",flags=re.I)
print(rf)#<_sre.SRE_Match object; span=(0, 7), match='adTYHad'>

# re.M(MULTILINE): 多行模式,改變'^''$'的行為

# re.S(DOTALL): 點任意匹配模式,改變'.'的行為,可有匹配換行
s = re.search(".+","yhi\n7907")
print(s)#<_sre.SRE_Match object; span=(0, 3), match='yhi'>
s = re.search(".+","yhi\n7907",flags= re.S)  
print(s)#<_sre.SRE_Match object; span=(0, 8), match='yhi\n7907'>

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM