閱讀967 返回首頁    go 技術社區[雲棲]


python正則表達式介紹及使用方法

1.正則表達式介紹

正則表達式(RE)是一種小型的、高度專業化的編程語言,它內嵌在python中,並通過re模塊實現。

    可以為想要匹配的相應字符串集指定規則

    該字符串集可能包含英文語句、email地址、命令或任何你想搞定的東西

    可以問諸如“這個字符串匹配該模式嗎”

    “在這個字符串中是否有部分匹配該模式呢”

    你也可以使用RE以各種方式來修改或者分割字符串

正則表達式模式被編譯成一係列的字節碼,然後由用C編寫的匹配引擎執行

正則表達式語音相對小型和受限(功能有限)

並非所有字符串處理都能用正則表達式完成

字符匹配:

    普通字符

        大多數字母和字符一般都會和自身匹配

    元字符:

1.[ ]

    常用來指定一個字符集:[abc]; [a-z]; [0-9]

    元字符在字符集中不起作用:[akm$]

    補集匹配不在區間範圍內的字符:[^5] ; [^abc]


2.^

    匹配行首。除非設置MULTILINE標誌,它隻是匹配字符串的開始。在MULTILINE模式裏,它可以直接匹配字符串中的每個換行。


3.$

    匹配行尾,行尾被定義為要麼是字符串尾,要麼是一個換行字符後麵的任何位置。


4.\

    反斜杠後麵可以加不同的字符以表示不同的特殊意義

    也可以用於取消所有的元字符:\[] 或 \\

    \d 匹配任何-十進製數;它相當於[0-9]

    \D匹配任何非數字字符,它相當於[^0-9]

    \s匹配任何空白字符,它相當於[\t\n\r\f\v]

    \S匹配任何非空白字符,它相當於[^\t\n\r\f\v]

    \w匹配任何字母數字字符,它相當於[a-zA-Z0-9_]

    \W匹配任何非字母數字字符,它相當於[^a-zA-Z0-9_]

5.重複

    正則表達式的第一功能是能夠匹配不定長的字符集,另一個功能是你可以指定正則表達式的一部分重複次數;重複次數放在大括號裏麵

    c{8}表示重複8次c;   \d{8}表示8位數字

6.*

    指定前一個字符可以被匹配0次或多次,而不是隻有一次。匹配引擎會試著重複盡可能多的次數(不超過整數界定範圍20億)

7.+

    表示匹配一次或更多次,

    *和+之間的不同:*匹配0或更多次,+匹配一或更多次

8.?

    匹配一次或零次:你可以認為它用於標誌某事物是可選的

    ?家長重複(6,7)後麵可以做最小匹配,a*?表示匹配0次a,a+?表示匹配一次a
9.*?, +?, ??

    非貪婪匹配,匹配最少的    

    <*> 會匹配'<H1>title</H1>'整個字符串(貪婪匹配),使用 *? 可以隻找出 <H1>(非貪婪匹配)

10.{m,n}

    其中m和n都是十進製整數,該限製符的意思是至少有m個重複,至多有n個重複。a\{1,3}b

    忽略m會認為下邊界是0,忽略n認為上邊界是無窮大(實際上是20億)

    {0,}等同於*; {1,}等同於+; {0,1}等同於?;如果可以的話最好用*   +   或?

11. |

    或者,隻匹配其中一個表達式,

    A|B,如果 A 匹配了,則不再查找 B,反之亦然

12.(...)

    匹配括號中的任意正則表達式

13.(?#...)

    注釋,忽略括號內的內容

14.(?=...)

    表達式‘...’之前的字符串,

    在字符串’ pythonretest ’中 (?=test) 會匹配’ pythonre ’

15.(?!...)

    後麵不跟表達式'...'的字符串,

    如果’ pythonre ’後麵不是字符串’ test ’,那麼 (?!test) 會匹配’ pythonre ’

16.(?<=...)

   跟在表達式’…’後麵的字符串符合括號之後的正則表達式

    正則表達式’ (?<=abc)def ’會在’ abcdef ’中匹配’ def ’

17.(?<!...)

    括號之後的正則表達式不跟在’…’的後麵

2.如何使用正則表達正則表達式’ (?<=abc)def ’會在’ abcdef ’中匹配’ def 式

    re模塊提供了一個正則表達式引擎的接口,可以讓你將REstring編譯成對象並用它們來進行匹配
    編譯正則表達式:
    import re
    p = re.compile(規則)
    例如:
    
>>> r1 = r"\d{3,4}-?\d{8}$"
>>> p_tel = re.compile(r1)
>>> p_tel
<_sre.SRE_Pattern object at 0x01BEFA30>
>>> p_tel.findall("056179882523")
['056179882523']

    re.compile()也可接受可選的標誌參數,常用來實現不同的特殊功能和語法變更。忽略大小寫需要編譯的時候加上re.I

    

>>> c_rel = re.compile(r"ahnu",re.I)
>>> c_rel.findall("Ahnu")
['Ahnu']
>>> 

    正則表達式執行匹配

    match():決定RE是否在字符串剛開始的位置匹配

    search():掃描字符串,找到這個RE匹配的位置

    findall():找到RE匹配的所有子串,並將他們作為一個列表返回

    finditer():找到RE匹配的所有子串,並將他們做為一個迭代器返回

如果沒有匹配成功,match()和search()方法會返回一個None,如果成功的話,會返回一個matchobject對象

    MatchObject實例方法:

    group():返回被RE匹配的字符串

    start():返回匹配開始的位置

    end():返回匹配結束的位置

    span():返回一個元組包含匹配(開始,結束)位置

     實際程序中,最常見的方法是將MatchObject保存在一個變量裏,然後檢查它是否為None

    

p = re.compile(...)
m = p.match("string goes here")
if m :
    print "Match found:",m.group()
else:
    print"match not found"

    模塊級函數:

    re模塊也提供了頂級函數調用如match()、search()、sub()、subn()、split()、sindall()等

   sub和subn是替換函數,

re.sub(pattern, repl, string[, count, flags])

在字符串 string 中找到匹配正則表達式 pattern 的所有子串,用另一個字符串 repl 進行替換。如果沒有找到匹配 pattern 的串,則返回未被修改的 string。Repl 既可以是字符串也可以是一個函數。對於 RegexObject 有:

sub(repl, string[, count=0])

此語法的示例有:

    

>>> l = "ahnu ahnn ahun sshh ahhh"
>>> res = "ah.."
>>> re.sub(res,"python",l)
'python python python sshh python'
>>> re.subn(res,"python",l)
('python python python sshh python', 4)
>>> 
    split()是分割函數

    

>>> res = r"[\+\-\*/]"
>>> l = "1+6-6*7/9"
>>> re.split(res,l)
['1', '6', '6', '7', '9']
>>> 


    編譯標誌:

    DOTALL,S:使.匹配包括換行在內的所有字符

    

>>> r1 = r"csvt.net"
>>> re.findall(r1,"csvt.net")
['csvt.net']
>>> re.findall(r1,"csvtonet")
['csvtonet']
>>> re.findall(r1,"csvt\nnet")
[]
>>> re.findall(r1."csvt\tnet")
SyntaxError: invalid syntax
>>> re.findall(r1,"csvt\tnet",re.S)
['csvt\tnet']
>>> 

    IGNORECASE,I:使匹配對大小寫不敏感

    MULTLINE,M:多行匹配,影響^和$

>>> s = """
ahnu hello
hello ahnu
ahnu i love lyou
i love you ahnu
"""
>>> r = r"^ahnu"
>>> re.findall(r,s)
[]
>>> re.findall(r,s,re.M)
['ahnu', 'ahnu']
>>> 


    VERBOSE,X:能夠使用REs的verbose狀態,忽略空格和#後麵的注釋,使之被組織的更清晰易懂

>>> s = """
\d{3,4}
-?
\d{7}
"""
>>> re.findall(s,"05617988252")
[]
>>> re.findall(s,"05617988252",re.X)
['05617988252']
>>> 


    LOCALE,L:做本地化識別,匹配本地特殊語法

最後更新:2017-04-03 16:48:56

  上一篇:go 技術人員談管理之項目群的核心特征
  下一篇:go linux下安裝ffmpeg