亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python正則表達式:字符集及內部順序

系統 1576 0

1.基礎內容

[] (中括號)用于描述正則表達式中的字符集,可以通過向字符集內部輸入字符來自定義匹配的內容。

            
              
                import
              
               re

regex1 
              
                =
              
               re
              
                .
              
              
                compile
              
              
                (
              
              
                '[ABC]'
              
              
                )
              
              
message1 
              
                =
              
              
                "Hello. This is ABC club. A man will serve you then."
              
              
                print
              
              
                (
              
              regex1
              
                .
              
              findall
              
                (
              
              message1
              
                )
              
              
                )
              
            
          

輸出:[‘A’, ‘B’, ‘C’, ‘A’]

正則表達式會根據中括號里的任意一個字符進行匹配。

如果想要匹配的字符很多,例如所有的大寫字母時,可以這樣操作:(這里是為了演示字符集的用法)

            
              regex2 
              
                =
              
               re
              
                .
              
              
                compile
              
              
                (
              
              
                '[A-Z]'
              
              
                )
              
              
message2 
              
                =
              
              
                "It's my DUTY to save your SOUL."
              
              
                print
              
              
                (
              
              regex2
              
                .
              
              findall
              
                (
              
              message2
              
                )
              
              
                )
              
            
          

輸出:[‘I’, ‘D’, ‘U’, ‘T’, ‘Y’]

如果還想匹配其他的內容,例如數字和大寫字母時:

            
              regex3 
              
                =
              
               re
              
                .
              
              
                compile
              
              
                (
              
              
                '[0-9A-Z]'
              
              
                )
              
              
message3 
              
                =
              
              
                "There are 7 GOBLINS and 2 dwarves in my house! Help!"
              
              
                print
              
              
                (
              
              regex3
              
                .
              
              findall
              
                (
              
              message3
              
                )
              
              
                )
              
            
          

輸出:[‘T’, ‘7’, ‘G’, ‘O’, ‘B’, ‘L’, ‘I’, ‘N’, ‘S’, ‘2’, ‘H’]

0-9,A-Z之間不分開。 如果想要匹配減號 ‘-’,使用轉義字符 ‘\-’ 來代替。

2.內部順序

繼續研究這個字符集,我產生了一個疑問:能否使用 [A-z] 這樣的順序呢?

答案是肯定的。不過,這里會發生一些特別的事情:

            
              regex4 
              
                =
              
               re
              
                .
              
              
                compile
              
              
                (
              
              
                '[A-z]'
              
              
                )
              
              
message4 
              
                =
              
              
                "ABC Z [^] abc z"
              
              
                print
              
              
                (
              
              regex4
              
                .
              
              findall
              
                (
              
              message4
              
                )
              
              
                )
              
              

regex5 
              
                =
              
               re
              
                .
              
              
                compile
              
              
                (
              
              
                '[M-m]'
              
              
                )
              
              
message5 
              
                =
              
              
                "KLMNO...klmno"
              
              
                print
              
              
                (
              
              regex5
              
                .
              
              findall
              
                (
              
              message5
              
                )
              
              
                )
              
            
          

輸出:[‘A’, ‘B’, ‘C’, ‘Z’, ‘[’, ‘^’, ‘]’, ‘a’, ‘b’, ‘c’, ‘z’]
[‘M’, ‘N’, ‘O’, ‘k’, ‘l’, ‘m’]

嗯……好像上面插入了某些符號?

這里大概可以得到出來一個結論: 對于 [(c1)-(c2)] 的結構,它是根據 ASCII 的順序操作的,表示可以匹配 c1 到 c2 之間(包括 c1 和 c2)的所有字符。

讓我們來驗證一下:

            
              regex6 
              
                =
              
               re
              
                .
              
              
                compile
              
              
                (
              
              
                '[#-E]'
              
              
                )
              
              
message6 
              
                =
              
              
                "Awesome! The last 5% M&M Candies (10 candies) are nice; I'll enjoy them!"
              
              
                print
              
              
                (
              
              regex6
              
                .
              
              findall
              
                (
              
              message6
              
                )
              
              
                )
              
            
          

輸出:[‘A’, ‘5’, ‘%’, ‘&’, ‘C’, ‘(’, ‘1’, ‘0’, ‘)’, ‘;’, “’”] -----(最后一個是單引號)

查看一下 ASCII 表:
35 - # , 69 - E

33 - !,37 - %,38 - &,39 - ',40 - (,41 - )
48 - 0,49 - 1,53 - 5
59 - ;
65 - A,73 - I

于是基本上可以確定: 字符集中,以 ‘-’ 為連接的字符順序滿足 ASCII 的排列規則 ,即: 對于 [(c1)-(c2)],對應的 ASCII 值 c1 <= c2 時,匹配 c1 到 c2 之間的字符。

讓我們做一個驗證:如果把 [(c1)-(c2)] 的順序交換,即 c1 的 ASCII 值小于 c2,會怎么樣呢?

            
              regex7 
              
                =
              
               re
              
                .
              
              
                compile
              
              
                (
              
              
                '[a-Z]'
              
              
                )
              
              
message7 
              
                =
              
              
                "Maybe it's wrong..."
              
              
                print
              
              
                (
              
              regex7
              
                .
              
              findall
              
                (
              
              message7
              
                )
              
              
                )
              
            
          

然后就會顯示一長串的報錯信息:

  • Traceback (most recent call last):
    File “G:/work/examples/eg_7_2.py”, line 27, in
    regex7 = re.compile(’[a-Z]’)
    File “D:\Python37\lib\re.py”, line 234, in compile
    return _compile(pattern, flags)
    File “D:\Python37\lib\re.py”, line 286, in _compile
    p = sre_compile.compile(pattern, flags)
    File “D:\Python37\lib\sre_compile.py”, line 764, in compile
    p = sre_parse.parse(p, flags)
    File “D:\Python37\lib\sre_parse.py”, line 930, in parse
    p = _parse_sub(source, pattern, flags & SRE_FLAG_VERBOSE, 0)
    File “D:\Python37\lib\sre_parse.py”, line 426, in _parse_sub
    not nested and not items))
    File “D:\Python37\lib\sre_parse.py”, line 580, in _parse
    raise source.error(msg, len(this) + 1 + len(that))
    re.error: bad character range a-Z at position 1 (手動加粗)

Process finished with exit code 1

大概意思就是:a-Z 不符合字符集匹配的順序(因為 a - 97,而 Z - 90,a 的 ASCII 值大于 Z),從而引發了問題。

結論:字符集中,以 ‘-’ 為連接的字符順序滿足 ASCII 的排列規則,前小后大。

更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 超碰v| 四虎影视永久免费观看网址 | 奇米影视4色 | 清纯唯美亚洲综合日韩第 | 午夜影院一区二区三区 | 久久在线 | 亚洲欧洲一区二区三区在线观看 | 国产不卡在线观看视频 | 国产大片91精品免费观看不卡 | 国产亚洲欧美一区 | 天天色天天综合网 | 前任4在线观看 | 亚洲全黄 | 97综合| 久久er99热这里只是精品 | 99视频精品全部免费观看 | 亚洲一区在线日韩在线深爱 | 久草视频在线播放 | 狠狠躁夜夜躁人人爽天天3 狠狠躁夜夜躁人人爽天天miya | 中文字幕在线视频精品 | 四虎精品永久免费 | 亚洲欧美综合乱码精品成人网 | 中国护士一级毛片免费版本 | 亚洲国产成人在线观看 | 九九视频这里只有精品 | 国产精品久久久一区二区三区 | 狠狠的干狠狠的操 | 免费一级淫片 | 亚洲区一区 | 国产精品一区久久 | 国产粉嫩白浆在线观看 | 亚洲精品视频在线播放 | 国产高清一区二区三区视频 | 色老头网站久久网 | 99热久久精品国产66 | 欧美毛片在线播放观看 | 亚洲精品视频免费 | 国产系列在线播放 | 四虎综合九九色九九综合色 | 亚洲精品免费视频 | 99在线资源 |