1. 程式人生 > >python --- re模塊

python --- re模塊

edi aware start error tar 技術 not 編號 obj

1.正則表達式的元字符有: . \ * + ? ^ $ {} [ ]

. 匹配除換行符以外的任意字符

\ 轉義字符,使後一個字符改變原來的意思

* 匹配前面字符0或多次

+ 匹配前面字符1或多次

?匹配一個字符0或多次

^ 匹配字符串開頭

$ 匹配字符串結尾

{} {m}匹配前一個字符m次,{m,n}匹配前一個字符m至n次,若省略n,則匹配m至無限次

[] 字符集。對應的位置可以是字符集中任意字符。字符集中的字符可以逐個列出,也可以給出範圍,如[abc]或[a-c].[^abc]表示取反,即非abc.

所有特殊字符在字符集中都失去其原有的特殊含義,用\反斜杠轉義恢復特殊字符的特殊含義

() 被括起來的表達式將作為分組,從表達式左邊開始沒遇到一個分組的左括號“(”,編號+1.
分組表達式作為一個整體,可以後接數量詞。表達式中的|僅在該組中有效。

這裏需要強調一下反斜杠的作用:

反斜杠後面跟元字符去除特殊功能(即將特殊字符轉義成普通字符)

反斜杠後面跟普通字符實現特殊功能 (即預定義字符)

引用序號對應的字組所匹配的字符串

a=re.search(r(tina)(fei)haha\2,tinafeihahafei tinafeihahatina).group()
print(a)
結果:
tinafeihahafei

2.預定義字符集:

\d: 表示數字0-9

\D:非數字

\s:匹配任何空白字符[<空格>\t\r\n\f\v]

\S:非空的字符

\w:匹配包括下劃線的任何字符[a-zA-Z0-9_]

\W:匹配非字母字符,即匹配特殊字符

\A:匹配字符開頭,同^

\z:匹配字符結尾,同$

\b:匹配單詞邊界匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, ‘er\b‘ 可以匹配"never" 中的 ‘er‘,但不能匹配 "verb" 中的 ‘er‘。

\B:和\b相反

這裏需要強調一下\b的單詞邊界的理解:
w = re.findall(\btina,tian tinaaaa)
print(w)
s = re.findall(r\btina,tian tinaaaa)
print(s)
v = re.findall(r\btina,tian#tinaaaa)
print(v)
a = re.findall(r
\btina\b,tian#tina@aaa) print(a) 執行結果如下: [] [tina] [tina] [tina]

三.re模塊中常用功能函數

1.compile()

編譯正則表達式模式,返回一個對象的模式。(可以把那些常用的正則表達式編譯成正則表達式對象,這樣可以提高一點效率。)

格式:

re.compile(pattern,flags=0)

pattern: 編譯時用的表達式字符串。

flags 編譯標誌位,用於修改正則表達式的匹配方式,如:是否區分大小寫,多行匹配等。常用的flags有:

標誌 含義
re.S(DOTALL) 使.匹配包括換行在內的所有字符
re.I(IGNORECASE) 使匹配對大小寫不敏感
re.L(LOCALE) 做本地化識別(locale-aware)匹配,法語等技術分享圖片
re.M(MULTILINE) 多行匹配,影響^和$
re.X(VERBOSE) 該標誌通過給予更靈活的格式以便將正則表達式寫得更易於理解
re.U 根據Unicode字符集解析字符,這個標誌影響\w,\W,\b,\B

import re
tt = "Tina is a good girl, she is cool, clever, and so on..."
rr = re.compile(r\w*oo\w*)
print(rr.findall(tt))   #查找所有包含‘oo‘的單詞
執行結果如下:
[good, cool]

2、match()

決定RE是否在字符串剛開始的位置匹配。//註:這個方法並不是完全匹配。當pattern結束時若string還有剩余字符,仍然視為成功。想要完全匹配,可以在表達式末尾加上邊界匹配符‘$‘

格式:

re.match(pattern, string, flags=0)

print(re.match(com,comwww.runcomoob).group())
print(re.match(com,Comwww.runcomoob,re.I).group())
執行結果如下:
com
com

3、search()

格式:

re.search(pattern, string, flags=0)

re.search函數會在字符串內查找模式匹配,只要找到第一個匹配然後返回,如果字符串沒有匹配,則返回None

print(re.search(\dcom,www.4comrunoob.5com).group())
執行結果如下:
4com

*註:match和search一旦匹配成功,就是一個match object對象,而match object對象有以下方法:

  • group() 返回被 RE 匹配的字符串
  • start() 返回匹配開始的位置
  • end() 返回匹配結束的位置
  • span() 返回一個元組包含匹配 (開始,結束) 的位置
  • group() 返回re整體匹配的字符串,可以一次輸入多個組號,對應組號匹配的字符串。

a. group()返回re整體匹配的字符串,
b. group (n,m) 返回組號為n,m所匹配的字符串,如果組號不存在,則返回indexError異常
c.groups()groups() 方法返回一個包含正則表達式中所有小組字符串的元組,從 1 到所含的小組號,通常groups()不需要參數,返回一個元組,元組中的元就是正則表達式中定義的組。

import re
a = "123abc456"
 print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0))   #123abc456,返回整體
 print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1))   #123
 print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2))   #abc
 print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3))   #456
###group(1) 列出第一個括號匹配部分,group(2) 列出第二個括號匹配部分,group(3) 列出第三個括號匹配部分。###

4、findall()

re.findall遍歷匹配,可以獲取字符串中所有匹配的字符串,返回一個列表。

格式:

re.findall(pattern, string, flags=0)

p = re.compile(r\d+)
print(p.findall(o1n2m3k4))
執行結果如下:
[1, 2, 3, 4]
import re
tt = "Tina is a good girl, she is cool, clever, and so on..."
rr = re.compile(r\w*oo\w*)
print(rr.findall(tt))
print(re.findall(r(\w)*oo(\w),tt))#()表示子表達式 
執行結果如下:
[good, cool]
[(g, d), (c, l)]

5、finditer()

搜索string,返回一個順序訪問每一個匹配結果(Match對象)的叠代器。找到 RE 匹配的所有子串,並把它們作為一個叠代器返回。

格式:

re.finditer(pattern, string, flags=0)

iter = re.finditer(r\d+,12 drumm44ers drumming, 11 ... 10 ...)
for i in iter:
    print(i)
    print(i.group())
    print(i.span())
執行結果如下:
<_sre.SRE_Match object; span=(0, 2), match=12>
12
(0, 2)
<_sre.SRE_Match object; span=(8, 10), match=44>
44
(8, 10)
<_sre.SRE_Match object; span=(24, 26), match=11>
11
(24, 26)
<_sre.SRE_Match object; span=(31, 33), match=10>
10
(31, 33)

6、split()

按照能夠匹配的子串將string分割後返回列表。

可以使用re.split來分割字符串,如:re.split(r‘\s+‘, text);將字符串按空格分割成一個單詞列表。

格式:

re.split(pattern, string[, maxsplit])

maxsplit用於指定最大分割次數,不指定將全部分割

print(re.split(\d+,one1two2three3four4five5))
執行結果如下:
[one, two, three, four, five, ‘‘]
print(re.split(\d+,one1two2three3four4five5))
執行結果如下:
[one, two, three, four, five, ‘‘]

python --- re模塊