python 正則表達(dá)式用法(摘抄)

說明

摘抄為主,忘記是在什么地方看見的原文了巷折。原作者別打我压鉴,若你見了請聯(lián)系我,增加你的版權(quán)和鏈接描述

整體過程

  1. Python通過re模塊提供對正則表達(dá)式的支持锻拘。
  2. 使用re的一般步驟是先將正則表達(dá)式的字符串形式編譯為Pattern實(shí)例
  3. 然后使用Pattern實(shí)例處理文本并獲得匹配結(jié)果(一個(gè)Match實(shí)例)
  4. 最后使用Match實(shí)例獲得信息油吭,進(jìn)行其他的操作。
  1. 引入正則庫
  2. 確定正則表達(dá)式格式
  3. 編譯表達(dá)式生成正則對象
  4. 其它相關(guān)正則對象操作
# encoding: UTF-8
#引入正則庫
import re
 
# 將正則表達(dá)式編譯成Pattern對象
pattern = re.compile(r'hello')
 
# 使用Pattern匹配文本署拟,獲得匹配結(jié)果婉宰,無法匹配時(shí)將返回None
jieguo = pattern.match('hello world!')
 
if jieguo:
    # 使用Match獲得分組信息
    print jieguo.group()
 
### 輸出 ###
# hello

編譯表達(dá)式生成正則對象

re.compile(strPattern[, flag])

  1. 例子:reobj1=re.compile(bbb,re.I|re.M|re.S)
  2. 解說:將字符串形式的正則表達(dá)式編譯為Pattern對象。 第二個(gè)參數(shù)flag是匹配模式推穷,取值可以使用按位或運(yùn)算符'|'表示同時(shí)生效心包,比如re.I | re.M。
  3. flag含義
  • re.I(re.IGNORECASE): 忽略大小寫(括號(hào)內(nèi)是完整寫法馒铃,下同)
  • M(MULTILINE): 多行模式蟹腾,改變'^'和'$'的行為(參見上圖)
  • S(DOTALL): 點(diǎn)任意匹配模式,改變'.'的行為
  • L(LOCALE): 使預(yù)定字符類 \w \W \b \B \s \S 取決于當(dāng)前區(qū)域設(shè)定
  • U(UNICODE): 使預(yù)定字符類 \w \W \b \B \s \S \d \D 取決于unicode定義的字符屬性
  • X(VERBOSE): 詳細(xì)模式区宇。這個(gè)模式下正則表達(dá)式可以是多行娃殖,忽略空白字符,并可以加入注釋议谷。以下兩個(gè)正則表達(dá)式是等價(jià)的:

Pattern對象

Pattern對象是一個(gè)編譯好的正則表達(dá)式炉爆,通過Pattern提供的一系列方法可以對文本進(jìn)行匹配查找。
Pattern不能直接實(shí)例化柿隙,必須使用re.compile()進(jìn)行構(gòu)造叶洞。

Pattern屬性:

Pattern提供了幾個(gè)可讀屬性用于獲取表達(dá)式的相關(guān)信息:

  1. pattern: 編譯時(shí)用的表達(dá)式字符串。
  2. flags: 編譯時(shí)用的匹配模式禀崖。數(shù)字形式衩辟。
  3. groups: 表達(dá)式中分組的數(shù)量。
  4. groupindex: 以表達(dá)式中有別名的組的別名為鍵波附、以該組對應(yīng)的編號(hào)為值的字典艺晴,沒有別名的組不包含在內(nèi)。
import re
p = re.compile(r'(\w+) (\w+)(?P<sign>.*)', re.DOTALL)

print "p.pattern:", p.pattern
print "p.flags:", p.flags
print "p.groups:", p.groups
print "p.groupindex:", p.groupindex

### output ###
# p.pattern: (\w+) (\w+)(?P<sign>.*)
# p.flags: 16
# p.groups: 3
# p.groupindex: {'sign': 3}
實(shí)例方法[ | re模塊方法]:
  1. match(string[, pos[, endpos]]) | re.match(pattern, string[, flags]):

這個(gè)方法將從string的pos下標(biāo)處起嘗試匹配pattern掸屡;如果pattern結(jié)束時(shí)仍可匹配封寞,則返回一個(gè)Match對象;如果匹配過程中pattern無法匹配仅财,或者匹配未結(jié)束就已到達(dá)endpos狈究,則返回None。

pos和endpos的默認(rèn)值分別為0和len(string)盏求;re.match()無法指定這兩個(gè)參數(shù)抖锥,參數(shù)flags用于編譯pattern時(shí)指定匹配模式亿眠。
注意:這個(gè)方法并不是完全匹配。當(dāng)pattern結(jié)束時(shí)若string還有剩余字符磅废,仍然視為成功纳像。想要完全匹配,可以在表達(dá)式末尾加上邊界匹配符'$'拯勉。
具體參見對于match對象的描述

  1. search(string[, pos[, endpos]]) | re.search(pattern, string[, flags]):

這個(gè)方法用于查找字符串中可以匹配成功的子串竟趾。從string的pos下標(biāo)處起嘗試匹配pattern,如果pattern結(jié)束時(shí)仍可匹配宫峦,則返回一個(gè)Match對象岔帽;若無法匹配,則將pos加1后重新嘗試匹配导绷;直到pos=endpos時(shí)仍無法匹配則返回None山卦。
pos和endpos的默認(rèn)值分別為0和len(string));re.search()無法指定這兩個(gè)參數(shù)诵次,參數(shù)flags用于編譯pattern時(shí)指定匹配模式。

#coding=utf-8

import re

# 將正則表達(dá)式編譯成Pattern對象
pattern = re.compile(r'(world)')

# 使用search()查找匹配的子串枚碗,不存在能匹配的子串時(shí)將返回None
# 這個(gè)例子中使用match()無法成功匹配
match = pattern.search('hello world!')

if match:
   # 使用Match獲得分組信息
   print match.group(0)   #整個(gè)匹配的字符串
   print match.group(1)   #第一個(gè)匹配的分組逾一,pattern = re.compile(r'(world)')沒括號(hào)沒分組

### 輸出 ###
# world
# world
  1. split(string[, maxsplit]) | re.split(pattern, string[, maxsplit]):

按照能夠匹配的子串將string分割后返回列表。masxsplit用于指定最大分割次數(shù)肮雨,不指定將全部分割遵堵。

import re

p = re.compile(r'\d+')
print p.split('one1two2three3four4')

### output ###
# ['one', 'two', 'three', 'four', '']
  1. findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags]):

搜索string,以列表形式返回全部能匹配的子串怨规。

import re

p = re.compile(r'\d+')
print p.findall('one1two2three3four4')

### output ###
# ['1', '2', '3', '4']
  1. finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags]):

搜索string陌宿,返回一個(gè)順序訪問每一個(gè)匹配結(jié)果(Match對象)的迭代器。

import re

p = re.compile(r'\d+')
for m in p.finditer('one1two2three3four4'):
   print m.group(),

### output ###
# 1 2 3 4
  1. sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]):

使用repl替換string中每一個(gè)匹配的子串后返回替換后的字符串波丰。
當(dāng)repl是一個(gè)字符串時(shí)壳坪,可以使用\id或\g<id>、\g<name>引用分組掰烟,但不能使用編號(hào)0爽蝴。
當(dāng)repl是一個(gè)方法時(shí),這個(gè)方法應(yīng)當(dāng)只接受一個(gè)參數(shù)(Match對象)纫骑,并返回一個(gè)字符串用于替換(返回的字符串中不能再引用分組)蝎亚。
count用于指定最多替換次數(shù),不指定時(shí)全部替換先馆。

import re

p = re.compile(r'(\w+) (\w+)')
s = 'i say, hello world!'

print p.sub(r'\2 \1', s)

def func(m):
   return m.group(1).title() + ' ' + m.group(2).title()

print p.sub(func, s)

### output ###
# say i, world hello!
# I Say, Hello World!

Match對象

Match對象是一次匹配的結(jié)果发框,包含了很多關(guān)于此次匹配的信息,可以使用Match提供的可讀屬性或方法來獲取這些信息煤墙。

屬性
  1. string: 匹配時(shí)使用的文本梅惯。
  2. re: 匹配時(shí)使用的Pattern對象宪拥。
  3. pos: 文本中正則表達(dá)式開始搜索的索引。值與Pattern.match()和Pattern.seach()方法的同名參數(shù)相同个唧。
  4. endpos: 文本中正則表達(dá)式結(jié)束搜索的索引江解。值與Pattern.match()和Pattern.seach()方法的同名參數(shù)相同。
  5. lastindex: 最后一個(gè)被捕獲的分組在文本中的索引徙歼。如果沒有被捕獲的分組犁河,將為None。
  6. lastgroup: 最后一個(gè)被捕獲的分組的別名魄梯。如果這個(gè)分組沒有別名或者沒有被捕獲的分組桨螺,將為None。
方法
  1. group([group1, …]):
    獲得一個(gè)或多個(gè)分組截獲的字符串酿秸;指定多個(gè)參數(shù)時(shí)將以元組形式返回灭翔。group1可以使用編號(hào)也可以使用別名;編號(hào)0代表整個(gè)匹配的子串辣苏;不填寫參數(shù)時(shí)肝箱,返回group(0);沒有截獲字符串的組返回None稀蟋;截獲了多次的組返回最后一次截獲的子串煌张。
  2. groups([default]):
    以元組形式返回全部分組截獲的字符串。相當(dāng)于調(diào)用group(1,2,…last)退客。default表示沒有截獲字符串的組以這個(gè)值替代骏融,默認(rèn)為None。
  3. groupdict([default]):
    返回以有別名的組的別名為鍵萌狂、以該組截獲的子串為值的字典档玻,沒有別名的組不包含在內(nèi)。default含義同上茫藏。
  4. start([group]):
    返回指定的組截獲的子串在string中的起始索引(子串第一個(gè)字符的索引)误趴。group默認(rèn)值為0。
  5. end([group]):
    返回指定的組截獲的子串在string中的結(jié)束索引(子串最后一個(gè)字符的索引+1)刷允。group默認(rèn)值為0冤留。
  6. span([group]):
    返回(start(group), end(group))。
  7. expand(template):
    將匹配到的分組代入template中然后返回树灶。template中可以使用\id或\g<id>纤怒、\g<name>引用分組,但不能使用編號(hào)0天通。\id與\g<id>是等價(jià)的泊窘;但\10將被認(rèn)為是第10個(gè)分組,如果你想表達(dá)\1之后是字符'0',只能使用\g<1>0烘豹。
import re
m = re.match(r'(\w+) (\w+)(?P<sign>.*)', 'hello world!')

print "m.string:", m.string
print "m.re:", m.re
print "m.pos:", m.pos
print "m.endpos:", m.endpos
print "m.lastindex:", m.lastindex
print "m.lastgroup:", m.lastgroup

print "m.group(1,2):", m.group(1, 2)
print "m.groups():", m.groups()
print "m.groupdict():", m.groupdict()
print "m.start(2):", m.start(2)
print "m.end(2):", m.end(2)
print "m.span(2):", m.span(2)
print r"m.expand(r'\2 \1\3'):", m.expand(r'\2 \1\3')
### output ###
# m.string: hello world!
# m.re: <_sre.SRE_Pattern object at 0x016E1A38>
# m.pos: 0
# m.endpos: 12
# m.lastindex: 3
# m.lastgroup: sign
# m.group(1,2): ('hello', 'world')
# m.groups(): ('hello', 'world', '!')
# m.groupdict(): {'sign': '!'}
# m.start(2): 6
# m.end(2): 11
# m.span(2): (6, 11)
# m.expand(r'\2 \1\3'): world hello!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瓜贾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子携悯,更是在濱河造成了極大的恐慌祭芦,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憔鬼,死亡現(xiàn)場離奇詭異龟劲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)轴或,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門昌跌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人照雁,你說我怎么就攤上這事蚕愤。” “怎么了饺蚊?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵萍诱,是天一觀的道長。 經(jīng)常有香客問我污呼,道長砂沛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任曙求,我火速辦了婚禮,結(jié)果婚禮上映企,老公的妹妹穿的比我還像新娘悟狱。我一直安慰自己,他們只是感情好堰氓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布挤渐。 她就那樣靜靜地躺著,像睡著了一般双絮。 火紅的嫁衣襯著肌膚如雪浴麻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天囤攀,我揣著相機(jī)與錄音软免,去河邊找鬼。 笑死焚挠,一個(gè)胖子當(dāng)著我的面吹牛膏萧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼榛泛,長吁一口氣:“原來是場噩夢啊……” “哼蝌蹂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起曹锨,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤孤个,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后沛简,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體齐鲤,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年覆享,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了佳遂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡撒顿,死狀恐怖丑罪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凤壁,我是刑警寧澤吩屹,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站拧抖,受9級(jí)特大地震影響煤搜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜唧席,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一擦盾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧淌哟,春花似錦迹卢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至掉弛,卻和暖如春症见,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背殃饿。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工谋作, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乎芳。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓瓷们,卻偏偏與公主長得像业栅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子谬晕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容

  • re模塊手冊 本模塊提供了和Perl里的正則表達(dá)式類似的功能碘裕,不關(guān)是正則表達(dá)式本身還是被搜索的字符串,都可以...
    喜歡吃栗子閱讀 4,009評論 0 13
  • 本文介紹了Python對于正則表達(dá)式的支持攒钳,包括正則表達(dá)式基礎(chǔ)以及Python正則表達(dá)式標(biāo)準(zhǔn)庫的完整介紹及使用示例...
    Python程序媛閱讀 1,349評論 0 22
  • 一 . 正則表達(dá)式中常用的字符含義 二 . re模塊中常用的功能函數(shù) 一 . 正則表達(dá)式中常用的字符含義 下...
    敢夢敢當(dāng)閱讀 512評論 0 0
  • 1. 正則表達(dá)式基礎(chǔ) 1.1. 簡單介紹 正則表達(dá)式并不是Python的一部分帮孔。正則表達(dá)式是用于處理字符串的強(qiáng)大工...
    隨風(fēng)化作雨閱讀 353評論 0 0
  • 2017年6月27日到29日三天我參加了余歌演說培訓(xùn),余歌老師全程授課不撑,讓我非常的敬佩文兢,感受到了余歌老師的...
    海瀾瀾閱讀 216評論 2 1