正則表達式
1. 通配符
點號可以匹配除了換行符外的任何單個字符。
特殊字符要轉義
前面加\
2. 字符集
用中括號括住字符串來創建字符集。字符集能匹配它包括的所有字符。只能匹配一個字符。
'[^abc]' # 可以匹配除了abc之外的字符
3. 選擇符和子模式
'p(ython|erl)' # 匹配兩個字符串
4. 可選項和重複子模式
在子模式後面加上問號,就變成可選項。
r'(http://)?(www\.)?python\.org'
能匹配到下列字符串而沒有其他模式:
'http://www.python.org'
'http://python.org'
'www.python.org'
'python.org'
可選子模式互相獨立。
每個可選子模式都用圓括號括起來。
使用原始字符串減少反斜線的數量。
對點好做了轉義,防止它成爲通配符使用。以下運算符可以允許子模式重複多次:
(pattern)*:重複零次以上
(pattern){m,n}:重複m-n次
(pattern)+:重複一次以上
'^ht+p'只在字符串開頭而不是其他位置匹配
$字符串結尾用$標記
- 常見正則:
\W 匹配任意不是字母,數字,下劃線,漢字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非數字的字符
\B 匹配不是單詞開頭或結束的位置
[^x] 匹配除了x以外的任意字符
re模塊內容
1.compile
re.compile(pattern[,flags])
將含正則表達式的字符串的轉換爲模式對象。
第二個參數flag是匹配模式,取值可以使用按位或運算符’|’表示同時生效,比如re.I | re.M。另外,你也可以在regex字符串中指定模式,比如re.compile(‘pattern’, re.I | re.M)與re.compile(‘(?im)pattern’)是等價的。
可選值有:
re.I(re.IGNORECASE): 忽略大小寫(括號內是完整寫法,下同)
M(MULTILINE): 多行模式,改變’^’和’$’的行爲
S(DOTALL): 點任意匹配模式,改變’.’的行爲
L(LOCALE): 使預定字符類 \w \W \b \B \s \S 取決於當前區域設定
U(UNICODE): 使預定字符類 \w \W \b \B \s \S \d \D 取決於unicode定義的字符屬性
X(VERBOSE): 詳細模式。這個模式下正則表達式可以是多行,忽略空白字符,並可以加入註釋。以下兩個正則表達式是等價的:
2.search
search(pattern,string[,flags])
在給定字符串中尋找第一個匹配的子串,一旦給定,就返回MatchObject(真值),否則返回false。函數在字符串內查找模式,直到找到第一個就退出,查找不到返回None,其參數和re.match一致。而與match的區別在於,match只是匹配字符串的開始,而search匹配整個字符串
3.match
match(pattern,string[,flags])
re.match從字符串的開始匹配一個模式,第一個參數是正則表達式,第二個字符串是要匹配的字符串,第三個參數是標誌位,缺省爲0;如果可以查找到則返回一個match對象,否則返回None。
>>> import re
>>> re.match("c","cdkfje")
<_sre.SRE_Match object at 0x00000000027D2D30>
>>> re.search("c","abcdef")
<_sre.SRE_Match object at 0x00000000027D2B28>
4.findall
re.findall(pattern,string)
可以獲取所有匹配的字符串,並且以list形式返回。
5.split
re.split(pattern,string[,count=0])
會根據模式匹配分割字符串
6.escape
escape(string)
字符串的正則式:前面加r
例如查找標點符號:
>>> text = '"hm...err -- are you suere ? "he said ,sountg ing.'
>>> import re
>>> pat = r'[.?/,"]+'
>>> re.findall(pat,text)
['"', '...', '?', '"', ',', '.']
7.分組
re模塊中能夠匹配時,會返回MatchObject對象。他們還包含匹配了子字符串哪部分的信息。稱爲group。
簡單說,group就是圓括號內的子模式。group的序號取決於它左側的括號數。小組是從左向右計數的,從1開始。組可以被嵌套。計數的數值可以能過從左到右計算打開的括號數來確定。
>>>p=re.compile('(a(b)c)d')
>>> m = p.match('abcd')
>>> m.group(0)
'abcd'
>>> m.group(1)
'abc'
>>> m.group(2)
'b'
- 對MatchObject類的方法有:
group ([序號]) 獲取給定組的匹配項
start()默認0是整個組,從1開始索引
end()
span()返回一個組的開始和結束位置
8.sub
作爲替換組號和函數
re.sub()
sub(replacement, string[, count = 0])
對於輸入的一個字符串,利用正則表達式(的強大的字符串處理功能),去實現(相對複雜的)字符串替換處理,然後返回被替換後的字符串