1. 程式人生 > >正則表示式的隨筆練習

正則表示式的隨筆練習

# 正則表示式 —練習實踐
import re
pattrn = "abc"
str1 = "qwe"
result = re.match(pattrn,str1)
print(result) # 匹配不到,返回預設值 None
# str1為匹配的物件,match為從頭匹配,pattrn為匹配規則

str2 = "abc"
result1 = re.match(str2,pattrn)
print(result1) # <_sre.SRE_Match object; span=(0, 3), match='abc'>
print(result1.group())#  abc  列印匹配的資料

"""
1、單字元匹配
    .   匹配任意一個字元,除了 /n ,如果加上 re.
    []  匹配[] 中列舉的字元
    
    \d  匹配數字 0-9
    \D  匹配非數字
    
    \s  匹配空白,即空白,Tab,\n,\t
    \S  匹配非空白
    
    \w  匹配單詞字元,a-z,A-Z,0-9,_ 共63個字元,包括各國文字
    \W  匹配非單詞字元
    
    注: 這些字元只匹配一個字元
"""
import re
ret = re.match(r".","a")
print(ret)
print(ret.group()) # a

ret = re.match(r"..","abc")
print(ret) # <_sre.SRE_Match object; span=(0, 2), match='ab'>
print(ret.group()) # ab

# 注意: 一個 . 只能匹配一個字元。並且匹配的規則的數量一定要比 匹配字串的數量要多
ret = re.match(r"..","a")
print(ret) # None
print("1"*20)
"""
\d  匹配數字
\D  匹配非數字
"""
ret = re.match("\d","123")
print(ret) # 1

ret = re.match("\D", "abc")
print(ret) # a
print("2"*20)

"""
\s 匹配空白,eg: Tab,空字串,空格,\n,\t,\n\t.
\S 匹配非空白
"""
ret =re.match(r"\s","")
print(ret)

ret = re.match(r"\s","\n")
print(ret)

ret = re.match(r"\s","\t")
print(ret)

ret = re.match(r"\s","\n\t")
print(ret)

ret = re.match(r"\s","  ") # 匹配Tab鍵
print(ret)

ret = re.match(r"\S","abc")
print(ret)  # a
"""
列印結果
    None
    <_sre.SRE_Match object; span=(0, 1), match='\n'>
    <_sre.SRE_Match object; span=(0, 1), match='\t'>
    <_sre.SRE_Match object; span=(0, 1), match='\n'>
    <_sre.SRE_Match object; span=(0, 1), match=' '>
    <_sre.SRE_Match object; span=(0, 1), match='a'>
"""
print("3"*20)

"""
\w   匹配單詞字元,a-z,A-Z,0-9,_ 63個字串,還包含各國文字[\u4e00-\u9fa5] 表示所有的中文
\W   匹配非單詞字元
"""
ret = re.match(r"\w","abc")
print(ret)

ret = re.match(r"\w+","Ac232_")
print(ret)

ret = re.match(r"\w+","中國")
print(ret)

ret = re.match(r"\W","#")
print(ret)

ret = re.match(r"\W","¥")
print(ret)
"""
列印結果:
    <_sre.SRE_Match object; span=(0, 1), match='a'>
    <_sre.SRE_Match object; span=(0, 6), match='Ac232_'>
    <_sre.SRE_Match object; span=(0, 2), match='中國'>
    <_sre.SRE_Match object; span=(0, 1), match='#'>
    <_sre.SRE_Match object; span=(0, 1), match='¥'>
"""
print("4"*20)

# 原始字串
import re
s = "c\\b\\a"
print(s) # c\b\a

ret = re.match(r"c\\b\\a","c\\b\\a")
print(ret)

ret = re.match(r"a.","ab")
print(ret)  # 這裡面的 . 不是普通字元

ret = re.match(r"a\.b","acb")
print(ret)  # 這裡面的 . 是普通字元,沒有其他的含義

ret = re.match(r"a.b","acb")
print(ret)  # 這裡面的 . 是普通字元,沒有其他的含義

ret = re.match(r"a\.b","a.b")
print(ret)

ret = re.match(r"[a,h,j,s]","abc")
print(ret)

ret = re.match(r"\[a\]","[a]")
print(ret)
# 注 : 加上 \ 表示反轉義,使原來的字元沒有特殊的含義。
"""
列印結果:
    c\b\a
    <_sre.SRE_Match object; span=(0, 5), match='c\\b\\a'>
    <_sre.SRE_Match object; span=(0, 2), match='ab'>
    None
    <_sre.SRE_Match object; span=(0, 3), match='acb'>
    <_sre.SRE_Match object; span=(0, 3), match='a.b'>
    <_sre.SRE_Match object; span=(0, 1), match='a'>
    <_sre.SRE_Match object; span=(0, 3), match='[a]'>
"""
print("5"*20)

"""
3、 表示數量的正則:
    *     匹配前一個字元出現0次或者多次
    +     至少出現一次
    ?    匹配前一個字元0次或者1次
    {m}   匹配前一個字元出現 m 次
    {m,n} 匹配前一個字元出現m到n次,至少m次
    {m,}  匹配前一個字元至少出現m次
"""

import re
ret = re.match(r"abc{2,4}","abccccccccc")
print(ret)

ret = re.match(r"abc{2,}","abccccccccc")
print(ret)

ret = re.match(r"abc{2}","abccccccccc")
print(ret)

ret = re.match(r"abc+","abcccccccccccc")
print(ret)

ret = re.match(r"abc*","abcc")
print(ret)

ret = re.match(r"abc*","ab")
print(ret)

"""
列印結果:
    <_sre.SRE_Match object; span=(0, 6), match='abcccc'>
    <_sre.SRE_Match object; span=(0, 11), match='abccccccccc'>
    <_sre.SRE_Match object; span=(0, 4), match='abcc'>
    <_sre.SRE_Match object; span=(0, 14), match='abcccccccccccc'>
    <_sre.SRE_Match object; span=(0, 4), match='abcc'>
    <_sre.SRE_Match object; span=(0, 2), match='ab'>
"""

print("6"*20)
"""
4 、表示邊界
    ^   匹配字串的開頭
    $   匹配字串的結尾
    \b  匹配一個單詞的邊界,
    \B  匹配非單詞邊界,
"""
import re
ret = re.search(r"world","hello world")
print(ret)

ret = re.search(r"^world","hello world")
print(ret)

ret = re.search(r"world$","hello world")
print(ret)

ret = re.search(r"who\b","who am i")
print(ret)

ret =re.search(r"who\b am","who am")
print(ret)
"""
列印結果:
    <_sre.SRE_Match object; span=(6, 11), match='world'>
    None
    <_sre.SRE_Match object; span=(6, 11), match='world'>
    <_sre.SRE_Match object; span=(0, 3), match='who'>
    <_sre.SRE_Match object; span=(0, 6), match='who am'>
"""
print("6"*20)

"""
6、 匹配分組:
    |      匹配左右兩邊任意的表示式
    (ab)   將括號
    \num   引用分組num匹配的字串
    (?P<name>)  分組起別名
    (?P=name)   引用別名為name分組匹配到的字串
"""
import re
ret = re.match(r"[1-7]?\d|100","70")  # [1-9] 表示 1-9 中任意的數字
print(ret)

ret = re.match(r"[1-9]?\d|70","7")
print(ret)

ret = re.match(r"[0-9]?\d$|100","07")
print(ret)

s="<html><h1>itcast</h1></html>"
ret = re.match(r"<(.+)><(.+)>.+</\2></\1>",s) #\num 的作用
print(ret)
print(ret.groups())   # 表示匹配到的組數  ("html","h1")
print(ret.group())    # 表示匹配的全部內容   <html><h1>itcast</h1></html>
print(ret.group(0))   # 表示匹配的全部內容   <html><h1>itcast</h1></html>
print(ret.group(1))   # 表示匹配到的第一個小括號的內容
print(ret.group(2))   # 表示匹配到的第二個小括號的內容
print("*"*20)
s="<html><h1>itcast,1</h1></html>"
ret =re.match(r"<html><h1>(.+),1</h1></html>",s)
print(ret)
print(ret.group(1))

# (?P<name>) 起別名  (?P=name) 引用別名
s = "<html><b>itcast</b></html>"
ret = re.match(r"<(?P<g1>.+)><(?P<g2>.+)>.+</(?P=g2)></(?P=g1)>",s)
print(ret)
print(ret.group())
"""
列印結果:
    <_sre.SRE_Match object; span=(0, 2), match='70'>
    <_sre.SRE_Match object; span=(0, 1), match='7'>
    <_sre.SRE_Match object; span=(0, 2), match='07'>
    <_sre.SRE_Match object; span=(0, 28), match='<html><h1>itcast</h1></html>'>
    <html><h1>itcast</h1></html>
    <html><h1>itcast</h1></html>
    html
    h1
    ********************
    <_sre.SRE_Match object; span=(0, 30), match='<html><h1>itcast,1</h1></html>'>
    itcast
    <_sre.SRE_Match object; span=(0, 26), match='<html><b>itcast</b></html>'>
    <html><b>itcast</b></html>
"""
"""
注 : [^0-9] 表示除了 0-9之外的字元  ^ 在內部使用的時候 表示相反的意思。 
"""

"""
6、 正則表示式的函式

    re模組的高階用法:
        compile 函式 : 用於編譯正則表示式,生成一個Pattern 物件

    格式:
        import re
        pattern = re.compile(正則表示式)

    比如說: 
        parrern =re.compile(r"\d+")
    
    Pattern 物件的一些常用方法主要有:
        match ()  :  從起始位置開始查詢,一次匹配
        search()  :  從任意位置開始查詢,一次匹配
        findall() :  全部匹配,返回一個列表
        finditer():  全部匹配,返回迭代器
        split()   :  分割字串,返回一個列表
        sub()     :  替換字串 
"""

"""
match() 函式  match(string,[start,end])
含義:
    start :  這個值可以取到  這裡面是索引為 16 的字元
    end   :  這個值取不到    這裡面是索引為 23 的字元
    跟列表的切片一樣,前閉後開 [ start, end )
"""


print("7"*20)
import  re
info = "abc"
pattern = re.compile(r"\w+")
ret = pattern.match(info)
print(ret)

info = "http://www.taobaooo.com"
pattern = re.compile(r"o+\.com")
ret = pattern.match(info,16,23)
print(ret)

print(ret.group())  # ooo.com
print(ret.span())   # (16,23)
print(ret.start())  # 16
print(ret.end())    # 23


"""
列印結果:
    77777777777777777777
    <_sre.SRE_Match object; span=(0, 3), match='abc'>
    <_sre.SRE_Match object; span=(16, 23), match='ooo.com'>
    ooo.com
    (16, 23)
    16
    23
"""

"""
search() 函式
    search(string,[start,end])
    re.I  忽略大小寫
    re.M  隻影響  ^  和  $ , 多行匹配
    當匹配到一個後,不會繼續向下面匹配
"""
print("8"*20)
pattern = re.compile(r"\d+")
ret = pattern.search("one123two456")
print(ret)

pattern = re.compile(r"[a-z]+",re.I)  # 忽略大小寫
ret = pattern.search("ABcde3456")
print(ret)

pattern = re.compile(r"a$")
ret = pattern.search("dff\na")
print(ret)

"""
列印結果:
    88888888888888888888
    <_sre.SRE_Match object; span=(3, 6), match='123'>
    <_sre.SRE_Match object; span=(0, 5), match='ABcde'>
    <_sre.SRE_Match object; span=(4, 5), match='a'>
"""

"""
findall(string[,pos[,endpos]])
    string 是匹配的字串,後面是可選引數,指定字串的起始和終點位置,預設值分別為0 和 字串的長度
    findall 以列表形式返回全部能匹配的子串,如果沒有匹配,那麼返回一個空的列表
"""
print("9"*20)
pattern = re.compile("a$",re.M)
ret = pattern.findall("a\naba")
print(ret)

pattern = re.compile("a$")
ret = pattern.findall("a\naba")
print(ret)
"""
列印結果:
    99999999999999999999
    ['a', 'a']
    ['a']
"""

"""
finditer()
    方法的行為跟 findall()的行為類似,也是搜尋整個字串
    獲得所有匹配的結果,但它返回的是一個迭代器物件。要遍歷迴圈出來
"""
print("0"*20)
pattern = re.compile(r"[a-z]+",re.I)
ret = pattern.finditer("aBc123Acd/*")
print(ret)
for i in ret :
    print(i)
    print(i.group())

"""
列印結果:
    00000000000000000000
    <callable_iterator object at 0x0000021E169BA208>
    <_sre.SRE_Match object; span=(0, 3), match='aBc'>
    aBc
    <_sre.SRE_Match object; span=(6, 9), match='Acd'>
    Acd
"""

"""
split(string[,maxsplit])
    maxsplit 用於指定最大的分割次數,不指定將符合要求的全部分割
"""
print("@"*20)
pattern = re.compile(r",")
ret = pattern.split("a,b,c,d,e")
print(ret)

ret2 = pattern.split("a,b,c,d,e",3)
# 這裡面的分割次數為3,分割次數可以無限大,還是把所有符合的都分割
print(ret2)


ret2 = pattern.split("a,b,c,d,e",30)
# 這裡面的分割次數為3,分割次數可以無限大,還是把所有符合的都分割
print(ret2)

"""
列印結果:
    @@@@@@@@@@@@@@@@@@@@
    ['a', 'b', 'c', 'd', 'e']
    ['a', 'b', 'c', 'd,e']
    ['a', 'b', 'c', 'd', 'e']
"""

"""
sub(repl,string[,count])
    這個不是從頭匹配
    其中 repl 可以是字串,也可以是一個函式:
        如果 repl 是字串,則會使用repl去替換掉,並返回替換後的字串,還可以使用id引用分組,但不能使用編號0
    
        如果 repl 是函式,這個方法應當只接受一個引數 Match物件。並且返回一個字串用於替換

        count 用於指定最多替換次數,不指定時全部替換
"""
print("&"*20)
info = "a hello 123,hello haha"
ret = re.sub(r"hello","hi",info)   # 預設全部替換
print(ret)

info = "a hello 123,hello haha"
ret = re.sub(r"hello","hi",info,1)  # 替換1個
print(ret)

info = "hello 123, hello haha "
ret = re.sub(r"(\w+) (\w+)",r"\2\1",info)
print(ret)

print("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
def add(x):
    print(x)
    print(type(x.group()))
    return str(int(x.group())+1)

ret = re.sub(r"\d+",add,"python = 996 java = 100")
print(ret)

# 改寫成匿名函式
ret = re.sub(r"\d+",lambda x : str(int(x.group())+1),"python = 10 java = 20")
print(ret)
"""
列印結果:
    &&&&&&&&&&&&&&&&&&&&
    a hi 123,hi haha
    a hi 123,hello haha
    123hello, hahahello 
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    <_sre.SRE_Match object; span=(9, 12), match='996'>
    <class 'str'>
    <_sre.SRE_Match object; span=(20, 23), match='100'>
    <class 'str'>
    python = 997 java = 101
    python = 11 java = 21
"""

"""
貪婪模式 和 非貪婪模式
    貪婪模式   : 儘可能多的匹配自己可以接受的內容
    非貪婪模式 : 前面正則可以匹配的,後面的正則也可以匹配的,讓後面的正則來匹配
"""
print("%"*20)
info = '<img src="hahajpg"> style="display:inline"'
ret = re.findall(r'src="(.*)"',info)
print(ret)

info = '<img src="hahajpg"> style="display:inline"'
ret = re.findall(r'src="(.*?)"',info)
print(ret)

"""
列印結果:
    %%%%%%%%%%%%%%%%%%%%
    ['hahajpg"> style="display:inline']
    ['hahajpg']
"""

re 模組的幾個引數:

re.M      多行匹配, 影響 ^, $


re.S      . 可以匹配任何字元,包括 \n


re.A      表示匹配 Ascii 碼


re.U      都使用 unicode編碼


re.I      忽略大小寫