正則表達式和python的re模塊


0 正則表達式

0.1 常見的元字符

.:    匹配除\r\n之外的任何單個字符

*:    匹配前面的子表達式任意次,例如Zz*可以匹配Z,可以匹配Zz,也可以匹配Zzzzzzzzzz

+:    匹配前面的子表達式任意次,例如hh+可以匹配hh,hhh,hhhhhhhhhhhhhhh

{n}:    匹配前面的子表達式n次,例如h{5}匹配hhhhhh

{n,}:    匹配前面的子表達式至少n次,例如h{5, } 匹配hhhhhh,hhhhhhhh,hhhhhhhhhhhhhhhhhh

{n,m}:    匹配前面的子表達式n到m次

?:    匹配前面的子表達式0次或1次,等價於{0,1},如果跟在* + ? {n} {n,} {n,m}后面則代表非貪婪模式。例如hhhhh,用h+匹配得到一個結果hhhhh,用h+?則匹配到5個結果,5個都是h。

 

\:    轉義字符,例如\\n匹配\n,\n匹配換行符,\\匹配\,\(匹配(

^:    匹配字符串的開頭,例如^hello匹配hello world

$:    匹配字符串的結尾,例如scut$匹配I am from scut

[...]:    字符集,匹配中括號內的任意字符,-代表范圍,^代表非,如果要表示[ ] - ^ 要在前面加上\ 或者把] - 放在首位,把^放到非首位,例如[^0-9]匹配非數字

|:    或,匹配左右表達式任意一個,如果左邊匹配成功,就不再匹配右邊的表達式,例如convex|function匹配convex或者匹配function

(...):    分組,作為一個整體被匹配,例如,(really ){5} 匹配really really really really really

(?P<name>...):    分組,同時起一個別名

(?P=name):    引用別名為name的分組匹配到的字符串

\<number>:    引用編號為number的分組匹配到的字符串

 

\d:    匹配數字,等價於[0-9]

\D:    匹配非數字,等價於[^0-9]

\s:    匹配不可見字符,等價於[\f\n\r\t\v],\t是制表符\x09,\n是換行符\x0a,\v是垂直制表符\x0b,\f是換頁符\x0c,\r是回車符\x0d

\S:    匹配可見字符,等價於[^\s]

\w:    匹配包括下划線的任何單詞字符(unicode字符集),類似但不等價於[A-Za-z0-9_]

\W:    匹配任何非單詞字符,等價於[^\w]

 

1 python中的正則

1.1 反斜杠

在編程語言中使用正則表達式,當我們要匹配\的時候需要用4個\來匹配,\\\\匹配\,因為第一次編程語言會把\\\\轉移成\\,然后第二次正則會把\\轉移成\。如果用python的原生字符串r來寫正則,則可以少寫兩個\,即r'\\'匹配\,r'\\d'匹配'\d',r‘\d’則匹配數字

 

1.2  re模塊的使用

# 首先將正則表達式編譯成Pattern對象
pattern = re.compile('keras')

# 可以用Pattern對象的match方法匹配文本,從頭開始但不要求完全的匹配,可在最后加入$則是完全匹配,返回Match對象或None
match = pattern.match('keras is a high-level neural networks API')

# 也可以用Pattern對象的search方法匹配文本,在文本中尋找子串的匹配,返回Match對象或None
match = pattern.search('keras is a high-level neural networks API')

# 用Match對象的方法輸出匹配結果
if match:
    print match.group()

# 另外可以直接使用re的方法進行匹配,這樣省了編譯那一行,但是不能復用。
re.match('tensorflow', 'tensorflow is an open-source library for Machine Intelligence')
re.search('Machine Intelligence', 'tensorflow is an open-source library for Machine Intelligence')

 

1.3  re.compile(pattern, flags=0)

返回:Pattern對象

pattern: 字符串形式的正則表達式,可利用上文的元字符和普通字符進行一系列組合得到

flags: 匹配模式,分為如下幾個(可用|使用多個,如re.I | re.

    re.I或re.IGNORECASE:忽略大小寫

    re.L或re.LOCALE:使用當地locale。(python中有個locale模塊,locale代表不同的語言,地區和字符集)

    re.U或re.UNICODE:使用unicode的locale

    re.M或re.MULTILINE:使用^或$時會匹配每一行的行首或行尾

    re.S或re.DOTALL:使用.時能匹配換行符

    re.X或re.VERBOX:忽略空白字符,而且可以加入注釋

 

1.4  Pattern對象

    Pattern對象代表一個正則表達式,包含如下幾個方法,這些方法在re都有對應的方法,參數略有不同,下面也一起給出

    match(string, pos=0, endpos=-1) | re.match(pattern, string, flags=0):    從頭開始匹配,返回一個Match對象或None。

    search(string, pos=0, endpos=-1) | re.search(pattern, string, flags=0):    尋找子串的匹配,返回一個Match對象或None

    split(string, maxsplit=0) | re.split(pattern, string, maxsplit=0, flags=0):    按照pattern切割string,maxsplit表示最大切割次數

    findall(string , pos=0, endpos=-1) | re.findall(pattern, string, flags=0):    搜索返回全部能匹配的子串

    finditer(string, pos=0, endpos=-1) | re.finditer(pattern, string, flags=0):    搜索返回match對象的迭代器

    sub(repl, string, count=0) | re.sub(pattern, repl, string, count=0, flags=0):    使用repl替換string中能匹配的每一個子串,返回替換后的子串,count指定最多替換次數。

    subn(repl, string, count=0) | re.subn(pattern, repl, string, count=0, flags=0):    相比於sub,多返回了一個次數,組成tuple。

 

1.5  Match對象

    Match對象代表匹配的結果,包含匹配的相關信息。

    包含如下屬性:string, re( 匹配時使用的Pattern對象), pos, endpos, lastindex(最后一個匹配的分組的下標), lastgroup(最后一個匹配的分組的別名)

    包含如下方法:

        group(group1, group2, group3,...):    

            返回一個或多個組匹配的子串,不填寫參數默認為group(0),代表整個匹配的子串。

            group1可以是編號,也可以是組的別名。

            沒匹配到的組返回None,匹配到多個子串的組返回最后一個。

        groups(default=None):    返所有組匹配的子串。當組沒有匹配到子串時候返回default。

        groupdict(default=None):    返回字典,鍵為組的別名,值為該組匹配到的子串。沒有別名的組不返回。

        start(groupNum=0):    返回指定組匹配的子串在string中的開始下標,沒有匹配則返回-1    

        end(groupNum=0):    返回指定組匹配的子串在string中的結束下標,沒有匹配則返回-1

        span(group=0):    返回(start(group), end(group))

 

1.6  unicode編碼

python中re模塊的正則最好統一使用unicode編碼,即u'...'的形式。

因為之前沒有使用unicode,在匹配中文的時候出現了匹配錯誤的結果。

猜測是re模塊里的方法默認使用unicode編碼來執行的。


免責聲明!

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



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