正規表示式
正則表達用來匹配字串
正規表示式匹配過程
正規表示式語法規則
.匹配除換行"\n"外的任意字串
abcabc
\轉義字元,使後乙個字元改變原來的意思
a\\c
a\c[...]
字符集,對應的位置可以是字符集中任意字元,字符集中的字元可以逐個列出,也可以給出範圍,如[abc]或[a-c]。第乙個字元如果是^則表示取反,如[^abc]表示不是abc中的其他字元。所有的特殊的字元在字符集中都失去其原有的特殊含義。在字符集中使用^、]或-,可以使用轉義字元匹配它們
a[bcd]e
abeace
ade\d
數字:[0-9]
a\dc
a1c\d
非數字:[^0-9]
a\dc
abc\s
空白字元:[空格》\t\r\n\f\v]
a\sc
a c\s
非空白字元:[^\s]
a\sc
abc\w
單詞程式設計客棧字元:[a-za-z0-9_]
a\wc
abc\w
非單詞字元:[^\w]
a\wc
a c*
匹配乙個字串0或無限次
abc*
ababc
abccc
+匹配乙個字串1次或無限次
abc+
abcabccc
?匹配乙個字串0次或1次
abc?
ababc
匹配乙個字串m次
abcabcc
匹配乙個字串m到n次
abcabcc
abccc
^匹配字串開頭
^abc
abc$
匹配字串末尾
abc$
abc\a
匹配字串開始
\aabc
abc\z
匹配字串結束,如果是存在換行,只匹配到換行前的結束字串
abc\z
abc\b
匹配乙個單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\b匹配非單詞邊界。'er\b' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
|匹配|表示式左右的任意乙個
abc|def
abcdef
(...)
作為分組,每遇到乙個(,分組編號加1,使用分組的好處是匹配的子串會儲存到乙個子組,便於以後使用
(abc)
abcabc
(?p...)
分組除原有編號外,再加乙個別名
(?pabc)
程式設計客棧 abcabc
hgrivu
\引用編號為number的分組匹配到的字串
(\d)ab\1
1ab1
5ab5
(?p=name)
應用別名為name的分組匹配到的字串
(?pabc)ee(?p=name)
abceeabc
(?:...)
(...)的不分組版本,用於|或後接數量詞
(?:abc)
abcabc
hgrivu (?ilmsux)
ilmsux中的每個字元代表正規表示式的一種匹配模式,只能用在正規表示式開頭,可選多個
(?i)abc
abc(?#...)
將#後面的字元當做注釋忽略
abc(?#comment)def
abcdef
(?=...)
之後的字串表示式需要匹配才能成功,不消耗字串內容
a(?=\d)
後面是數字的a
(?!...)
之後的字串表示式需要不匹配才能成功,不消耗字串內容
a(?!\d)
後面不是數字的a
(?<=...)
之前的字串表示式需要匹配才能成功,不消耗字串內容
(?<=\d)a
前面是數字的a
(?之前的字串表示式需要不匹配才能成功,不消耗字串內容
(?前面不是數字的a
(?(id/name)yes_
pattern|no_parttern)
如果匹配到分組為id或別名name的字串成功匹配,則需要匹配yes_pattern
不成功,怎需要匹配no_pattern
(\d)abc(?(1)\d|def)
1abc3
abcdef
貪婪模式和非貪婪模式
貪婪模式是盡可能多的匹配字串,python預設為貪婪模式,非貪婪模式盡可能少的匹配字串,在正規表示式後面加個?表示非貪婪模式。例如:字串abcccb,貪婪模式正規表示式為ab.*c,非貪婪模式的正規表示式為ab.*?c,貪婪模式結果為abccc,非貪婪模式結果為abc,再比如字串abbb,貪婪模式正規表示式為ab?,非貪婪模式正則表達為ab??,貪婪模式結果為ab,非貪婪結果為a。
python的re模組
re模組的方法:
1.compile(pattern[,flag]):對正規表示式pattern進行編譯,編譯後比直接查詢速度快
2.match(patter,string[,flag]):從字串string的開始就匹配,若匹配成功,則返回匹配物件,否則返回none(none物件沒有group()和groups()方法,不判斷直接呼叫這兩個方法,則會出現異常)
3.search(pattern,string[,flag]):從字串中查詢,若匹配成功,則返回匹配物件,否則返回none
4.findall(pattern,string[,flag]):在字串 string 中查詢正規表示式模式 pattern 的所有(非重複)出現;返回乙個匹配物件的列表
5.finditer(pattern,string[, flags])b 和 findall()相同,但返回的不是列表而是迭代器;對於每個匹配,該迭代器返回乙個匹配物件
6.split(pattern,string, max=0) 根據正規表示式 pattern 中的分隔符把字元 string 分割為乙個列表,返回成功匹配的列表,最多分割 max 次(預設是分割所有匹配的地方)
7.sub(pattern, repl, string, max=0) 把字串 string 中所有匹配正規表示式 pattern 的地方替換成字串 repl,如果 max 的值沒有給出, 則對所有匹配的地方進行替換
匹配物件的方法和屬性:
引數flag:
re.i
使匹配對大小寫不敏感
re.l
做本地化識別(locale-aware)匹配
re.m
多行匹配,影響 ^ 和 $
re.s
使 . 匹配包括換行在內的所有字元
re.u
根據unicode字符集解析字元。這個標誌影響 \w, \w, \b, \b.
re.x
該標誌通過給予你更靈活的格式以便你將正規表示式寫得更易於理解。
python使用正規表示式的例子
>>> import re
>>> pattern = re.compile(r'foo')
>>> res1 = re.search(pattern,'foo')
>>> res1.group() # 返回的是匹配物件,需要呼叫group()方法,顯示所有的匹配物件
'foo'
>>> res1.groups()# 因為沒有子組(即正規表示式中沒有分組),返回空元組
()>>> res2 = re.findall(pattern,'foobbfoo')
>>> res2 # 直接返回的是乙個列表,包含所有匹配的字元
['foo', 'foo']
>>> pattern2 = re.compile(r'(\d+)aa')
>>> res3 = re.search(pattern2,'bb32aa')
>>> res3.group() # 返回所有的匹配的物件
'32aa'
>>> res3.groups() # 對比res1的groups(),正則裡有分組,返回匹配到的分組
('32',)
>>> res4 = re.findall(pattern2,'bb32aacc5aacc')
>>> res4 # 對比res2,返回乙個列表,但只包含所匹配分組裡面的字元,
['32', '5']
總結本文標題: python正規表示式及使用正規表示式的例子
本文位址: /wangluo/re/218275.html
Python正規表示式使用
python正規表示式使用 正規表示式不是python內建的功能,所以需要引入import re模組才可以使用。正規表示式的功能很多,但是我們通常使用的功能也就是那幾個,這裡對工作中經常使用到的正規表示式進行乙個系統的總結。1.字元 匹配除了換行符 n 外的字元 轉義字元,使後乙個字元改變以前的意思...
python 正規表示式使用
場景 替換很多動態資料的時候,會重複很多的條件判斷if,replace。作用 完成多步,同時去匹配符合特定規則的字串,完成通用的正則匹配 正規表示式是一種通用的字串匹配技術,是不會因為程式語言不同發生變化。想要查詢某種特徵的,具有一定規則的字串,都是可以嘗試使用正規表示式 jsonpath,xpat...
Python正規表示式使用
python通過re模組提供對正規表示式的支援 使用re的一般步驟是先將正規表示式的字串形式 編譯為pattern例項,然後使用pattern例項處理文字並獲得匹配結果,最後使用match 例項獲得資訊,進行其他操作。主要用到的方法列舉如下 首先說一 下re 中compile 函式,它將乙個正規表示...