Python正則表達(dá)式

在編寫處理網(wǎng)頁文本的程序時,經(jīng)常會有查找符合某些復(fù)雜規(guī)則的字符串的需要,正則表達(dá)式就是描述這些規(guī)則的工具枫攀。

基本語法和使用

1.常用元字符

元字符 含義
. 匹配除換行符以外的任意字符
\b 匹配單詞的開始或結(jié)束
\d 匹配數(shù)字
\w 匹配字母必指、數(shù)字囊咏、下劃線或漢字
\s 匹配任意空白符,包括空格、制表符梅割、換行符霜第、中文全角空格等
^ 匹配字符串的開始
$ 匹配字符串的結(jié)束

2.字符轉(zhuǎn)義

使用’\’作為轉(zhuǎn)義字符。

3.重復(fù)

限定符 含義
* 重復(fù)0次或更多次
+ 重復(fù)1次或更多次
? 重復(fù)0次或者1次
{n} 重復(fù)n次
{n,} 重復(fù)n次或更多次
{n,m} 重復(fù)n到m次

4.字符集合

  • [0-9]與\d等價
  • [a-z0-9A-Z]與\w等價

5.分支條件

例:電話號碼中有一種是3位區(qū)號户辞,8位本地號(010-11223344)泌类,另一種是4位區(qū)號,7位本地號(0321-1234567)底燎;這時需要用到分支條件:0\d{2}-\d{8} | 0\d{3}-\d{7} 從左到右依次匹配刃榨,前面的條件滿足了就不看后面的了,條件之間是一種或的關(guān)系双仍。

6.分組

例:匹配192.168.1.1這樣的IP地址枢希。
((\d{1,3})\.){3}\d{1,3}。但是這樣有可能出現(xiàn)333.444.555.666這樣的IP地址所以是不合理的朱沃。
以下才是合理的表示方式苞轿。
((25[0-5] | 2[0-4]\d[0-1]\d{2} | [1-9]?\d)\.){3}((25[0-5] | 2[0-4]\d[0-1]\d{2} | [1-9]?\d)\.)

7.反義

代碼 含義
\W 匹配任意不是字母、數(shù)字逗物、下劃線搬卒、漢字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非數(shù)字的字符
\B 匹配不是單詞開頭或結(jié)束的位置
[^a] 匹配除了a以外的任意字符
[^abcde] 匹配除了a、b翎卓、c秀睛、d、e這幾個字母以外的任意字符
[^(123 莲祸!abc)] 匹配除了a、b椭迎、c和1锐帜、2、3這幾個字符以外的任意字符

8.后向引用

9.零寬斷言

10.注釋

(?#comment)
例如:\b\w+(?#字符串)\b

11.貪婪與懶惰

12.處理選項

python與正則

1.re.match(pattern,string[,flags])

代碼:

import re
# 將正則表達(dá)式編譯成pattern對象
pattern = re.compile(r'\d+')
# 使用re.match匹配文本畜号,獲得匹配結(jié)果缴阎,無法匹配時將返回None
result1 = re.match(pattern,'192abc')

if result1:
  print(result1.group())
else:
  print('匹配失敗1')
result2 = re.match(pattern,'abc192')
print(result2)
if result2:
  print(result2.group())
else:
  print('匹配失敗2')

運(yùn)行結(jié)果:

192
None
匹配失敗2

2.re.search(pattern,string[,flags])

代碼:

import re
# 將正則表達(dá)式編譯成pattern對象
pattern = re.compile(r'dogs')
# 使用re.match匹配文本,獲得匹配結(jié)果简软,無法匹配時將返回None
result1 = re.match(pattern,'Cats are smarter than dogs')
if result1:
  print(result1.group())
else:
  print('匹配失敗1')
# 使用re.search匹配文本蛮拔,獲得匹配結(jié)果,無法匹配時將返回None
result2 = re.search(pattern,'Cats are smarter than dogs')
if result2:
  print(result2.group())
else:
  print('匹配失敗2')

運(yùn)行結(jié)果:

匹配失敗1
dogs

3.re.findall(pattern,string[,flags])

代碼:

import re
pattern = re.compile(r'\d+')
print(re.findall(pattern,'A1B2C3D4'))

運(yùn)行結(jié)果:

[‘1’, ‘2’, ‘3’, ‘4’]

4.re.finditer(pattern,string[,flags])

代碼:

import re
pattern = re.compile(r'\d+')
matchiter = re.finditer(pattern,'A1B2C3D4')
for match in matchiter:
  print(match.group())

運(yùn)行結(jié)果:

1
2
3
4

5.re.sub(patter,repl,string[,count])

代碼:

import re
pattern = re.compile(r'(?P<word1>\w+) (?P<word2>\w+)') # 使用名稱引用
s = 'i say,hello world!'
print(pattern.sub(r'\g<word2> \g<word1>',s))
pattern = re.compile(r'(\w+) (\w+)')

print(pattern.sub(r'\2 \1',s))    # 使用編號
def func(m):
  return m.group(1).title()+' '+m.group(2).title()

print(pattern.sub(func,s))

運(yùn)行結(jié)果:

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

6.re.subn(pattern,repl,string[,count])

代碼:

import re
s = 'i say,hello world!'
pattern = re.compile(r'(\w+) (\w+)')
print(pattern.subn(r'\2 \1',s))
def func(m):
  return m.group(1).title()+' '+m.group(2).title()
print(pattern.subn(func,s))

運(yùn)行結(jié)果:

(‘say i,world hello!’, 2)
(‘I Say,Hello World!’, 2)

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

代碼:

import re
pattern = re.compile(r'\d+')
print(re.split(pattern,'A1B2C3D4'))

運(yùn)行結(jié)果:

[‘A’, ‘B’, ‘C’, ‘D’, ‘’]

Match對象的屬性和方法

代碼:

import re
pattern = re.compile(r'(\w+) (\w+) (?P<word>.*)')
match = pattern.match('I love you!')

print("match.string:",match.string)
print("match.re:",match.re)
print("match.pos:",match.pos)
print("match.endpos:",match.endpos)
print("match.lastindex:",match.lastindex)
print("match.lastgroup:",match.lastgroup)
print("match.group(1,2):",match.group(1,2))
print("match.groups():",match.groups())
print("match.groupdict():",match.groupdict())
print("match.start(2):",match.start(2))
print("match.end(2):",match.end(2))
print("match.span(2):",match.span(2))
print("match.expand(r'\\2 \\1 \\3'):",match.expand(r'\2 \1 \3'))

運(yùn)行結(jié)果:

match.string: I love you!
match.re: re.compile(‘(\w+) (\w+) (?P<word style="box-sizing: border-box;">.*)’)
match.pos: 0
match.endpos: 11
match.lastindex: 3
match.lastgroup: word
match.group(1,2): (‘I’, ‘love’)
match.groups(): (‘I’, ‘love’, ‘you!’)
match.groupdict(): {‘word’: ‘you!’}
match.start(2): 2
match.end(2): 6
match.span(2): (2, 6)
match.expand(r’\2 \1 \3’): love I you!</word>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末痹升,一起剝皮案震驚了整個濱河市建炫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疼蛾,老刑警劉巖肛跌,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡衍慎,警方通過查閱死者的電腦和手機(jī)转唉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稳捆,“玉大人赠法,你說我怎么就攤上這事∏呛唬” “怎么了砖织?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驯嘱。 經(jīng)常有香客問我镶苞,道長,這世上最難降的妖魔是什么鞠评? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任茂蚓,我火速辦了婚禮,結(jié)果婚禮上剃幌,老公的妹妹穿的比我還像新娘聋涨。我一直安慰自己,他們只是感情好负乡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布牍白。 她就那樣靜靜地躺著,像睡著了一般抖棘。 火紅的嫁衣襯著肌膚如雪茂腥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天切省,我揣著相機(jī)與錄音最岗,去河邊找鬼。 笑死朝捆,一個胖子當(dāng)著我的面吹牛般渡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芙盘,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼驯用,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了儒老?” 一聲冷哼從身側(cè)響起蝴乔,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎驮樊,沒想到半個月后淘这,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剥扣,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年铝穷,在試婚紗的時候發(fā)現(xiàn)自己被綠了钠怯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡曙聂,死狀恐怖晦炊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宁脊,我是刑警寧澤断国,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站榆苞,受9級特大地震影響稳衬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坐漏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一薄疚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赊琳,春花似錦街夭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至趁尼,卻和暖如春埃碱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酥泞。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工乃正, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人婶博。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像荧飞,于是被迫代替她去往敵國和親凡人。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353