Python正則表達式使用

Python正則表達式使用

    正則表達式不是python內置的功能,所以需要引入import re模塊纔可以使用。正則表達式的功能很多,但是我們通常使用的功能也就是那幾個,這裏對工作中經常使用到的正則表達式進行一個系統的總結。

1.   字符:

    . 匹配除了換行符“\n”外的字符

    \ 轉義字符,使後一個字符改變以前的意思。如\* 只表示一個字符*

    [] 字符集,範圍字符。括號中的字符可以枚舉,也可以定義範圍,如[abc],[a-c]

2.     預定義字符集(可以出現在字符集[…]中)

    \d 數字,[0-9]

    \D 非數字,[^0-9]

    \s 空白字符,[空格\t\r\n\f\v]

    \S 非空白字符,[^\s]

    \w 單詞字符,字母數字下劃線[a-zA-Z0-9_]

    \W 非單詞字符,[^\W]

3.     數量詞(用在字符或(…)之後)

    ? 匹配0個或1個字符

    + 匹配1個或多個字符

    * 匹配0個或多個字符

    {m} 匹配前一個字符出現m次

    {m,n} 匹配前一個字符出現m至n次;省略m,匹配0至n次;省略n,匹配m至無限次

    ?? +? ? {m,n}? 使?,+,*,{m,n}變成非貪婪模式

4.     邊界匹配(不消耗待匹配字符串中的字符)

    ^ 匹配字符串開頭,多行模式中匹配每一行的開頭

    $ 匹配字符串的結尾,多行模式中匹配每一行的結尾

    \A 緊匹配字符串開頭

    \Z 僅匹配字符串結尾

    \b 匹配\w和\W之間    a\b!bc 匹配 a!bc

    \B [^\b]              a\Bbc   匹配 abc

5.    邏輯分組

    | 代表表達式任意匹配一個,先嚐試左邊匹配,左邊匹配成功則跳過右邊表達式。如果|沒有被包含在()中,則它的範圍是整個正則表達式

    (…) 括號中的表達式將分組,從表達式左邊,每遇到一個分組的左括號“(”編號+1。分組表達式作爲一個整體,後面可接數量詞。表達式中的|僅在改組中有效

    (?P<name>…)分組除了原有的編號外,爲分組指定一個別名,如 (?P<id>abc){2}匹配abcabc

    \<number> 引用編號爲number的分組到字符串中

    (?P=name) 引用別名爲name的分組匹配到的字符串,如 (?P<id>\d)abc(?P=id)匹配 1abc1,5abc5

6.    正則練習:

m.group 輸出匹配的所有子字符串合集,等價於m.group(0);m.groups()輸出匹配的所有子字符串,下表從1開始;

1)  匹配字符串全部是小寫

importre
str = 'abcdef'
p = re.compile('^[a-zA-Z]*$')
m = p.match(str)
if m:
    print 'm.group()::',m.group()
    print 'm.groups()::',m.groups()

 

輸出:

m.group():: abcdef

m.groups():: ()

2)  從http請求中返回的content-type內容提取出charset的值

Import re

str ='text/html; charset=utf-8'
#?i 忽略大小寫,與寫在後面是一致的,re.compile(pattern,flags)
r = re.compile('(?i).*charset\\s*=\\s*([^\\s]+)')
m = r.match(str)
if m:
    print 'm.group()::',m.group()
    print 'm.groups()::',m.groups()

輸出:

m.group():: text/html; charset=utf-8

m.groups():: ('utf-8',)

 

3)  匹配名字、姓名和電話

Import re

str ='Doe, John: 555-1212'
p = re.compile('(?P<last>\w+), (?P<first>\w+): (?P<phone>\S+)')
m = p.match(str)
if m:
    print 'm.group()::',m.group()
    print 'm.group(first)::',m.group('first'),m.group(2)
    print 'm.group(last)::',m.group('last'),m.group(1)
    print 'm.group(phone)::',m.group('phone'),m.group(3)

輸出:

m.group():: Doe, John: 555-1212

m.groups(first):: John John

m.groups(last):: Doe Doe

m.groups(phone):: 555-1212 555-1212

4)  提取出IP和路徑

importre
str = '192.168.22.77:/home/adf'
p = re.compile('(?P<ip>\d+\.\d+\.\d+\.\d+):(?P<path>.+)')
m = p.match(str)
if m:
    print 'm.group()::',m.group()
    print 'm.groups()::',m.groups()
    print 'm.group(ip)::',m.group('ip')
    print 'm.group(path)::',m.group('path')

輸出:

m.group():: 192.168.22.77:/home/adf

m.groups():: ('192.168.22.77', '/home/adf')

m.group(ip):: 192.168.22.77

m.group(path):: /home/adf

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章