正則表達式

參考博客:

https://www.cnblogs.com/greatfish/p/7572131.html

一户秤、 字符與字符類

1.特殊字符: .^$?+*{}|

以上特殊字符要想使用字面值,必須使用\進行轉(zhuǎn)義

2.字符類
  • 包含在[]中的一個或者多個字符被稱為字符類,字符類在匹配時如果沒有指定量詞則只會匹配其中的一個。
  • 字符類內(nèi)可以指定范圍涝缝,比如[a-zA-Z0-9]表示a到z茵典,A到Z获黔,0到9之間的任何一個字符
  • 左方括號后跟隨一個,表示否定一個字符類仰担,比如[0-9]表示可以匹配一個任意非數(shù)字的字符糊识。
  • 字符類內(nèi)部,除了\之外,其他特殊字符不再具備特殊意義赂苗,都表示字面值铃将。放在第一個位置表示否定,放在其他位置表示本身哑梳,-放在中間表示范圍劲阎,放在字符類中的第一個字符,則表示-本身鸠真。
  • 字符類內(nèi)部可以使用速記法悯仙,比如\d \s \w
3.速記法
  • 可以匹配除換行符之外的任何字符,如果有re.DOTALL標志吠卷,則匹配任意字符包括換行
  • \d 匹配一個Unicode數(shù)字锡垄,如果帶re.ASCII,則匹配0-9
  • \D 匹配Unicode非數(shù)字
  • \s 匹配Unicode空白祭隔,如果帶有re.ASCII货岭,則匹配\t\n\r\f\v中的一個
  • \S 匹配Unicode非空白
  • \w 匹配Unicode單詞字符,如果帶有re.ascii,則匹配[a-zA-Z0-9_]中的一個
  • \W 匹配Unicode非單子字符

二疾渴、量詞

  1. ? 匹配前面的字符0次或1次
  2. * 匹配前面的字符0次或多次
  3. + 匹配前面的字符1次或者多次
  4. {m} 匹配前面表達式m次
  5. {m,} 匹配前面表達式至少m次
  6. {,n} 匹配前面的正則表達式最多n次
  7. {m,n} 匹配前面的正則表達式至少m次千贯,最多n次

注意點:
   以上量詞都是貪婪模式,會盡可能多的匹配搞坝,如果要改為非貪婪模式搔谴,通過在量詞后面跟隨一個?來實現(xiàn)

三、組與捕獲

  1. ()的作用:
    1.1 捕獲()中正則表達式的內(nèi)容以備進一步利用處理桩撮,可以通過在左括號后面跟隨?:來關(guān)閉這個括號的捕獲功能
    1.2 將正則表達式的一部分內(nèi)容進行組合敦第,以便使用量詞或者|
  2. 反響引用前面()內(nèi)捕獲的內(nèi)容:
    2.1 通過組號反向引用
    每一個沒有使用?:的小括號都會分配一個組好,從1開始店量,從左到右遞增芜果,可以通過\i引用前面()內(nèi)表達式捕獲的內(nèi)容
    2.2 通過組名反向引用前面小括號內(nèi)捕獲的內(nèi)容
      可以通過在左括號后面跟隨?P<name>,尖括號中放入組名來為一個組起一個別名,后面通過(?P=name)來引用 前面捕獲的內(nèi)容融师。如(? P<word>\w+)\s+(?P=word)來匹配重復(fù)的單詞右钾。
  3. 注意點:
      反向引用不能放在字符類[]中使用。

四诬滩、斷言與標記

斷言不會匹配任何文本霹粥,只是對斷言所在的文本施加某些約束
1 常用斷言:
 1. \b 匹配單詞的邊界,放在字符類[]中則表示backspace
 2. \B 匹配非單詞邊界疼鸟,受ASCII標記影響
 3. \A 在起始處匹配
 4. ^ 在起始處匹配后控,如果有MULTILINE標志,則在每個換行符后匹配
 5. \Z 在結(jié)尾處匹配
 6. $ 在結(jié)尾處匹配空镜,如果有MULTILINE標志浩淘,則在每個換行符前匹配
 7. (?=e) 正前瞻
 8. (?!e) 負前瞻
 9. (?<=e) 正回顧
 10.(?<!e) 負回顧
2 前瞻回顧的解釋
  前瞻: exp1(?=exp2) exp1后面的內(nèi)容要匹配exp2
  負前瞻: exp1(?!exp2) exp1后面的內(nèi)容不能匹配exp2
  后顧: (?<=exp2)exp1 exp1前面的內(nèi)容要匹配exp2
  負后顧: (?<!exp2)exp1 exp1前面的內(nèi)容不能匹配exp2
例如:我們要查找hello捌朴,但是hello后面必須是world,正則表達式可以這樣寫:"(hello)\s+(?=world)",用來匹配"hello wangxing"和"hello world"只能匹配到后者的hello

五张抄、條件匹配

(?(id)yes_exp|no_exp):對應(yīng)id的子表達式如果匹配到內(nèi)容砂蔽,則這里匹配yes_exp,否則匹配no_exp

六署惯、正則表達式的標志

  1. 正則表達式的標志有兩種使用方法
      1. 通過給compile方法傳入標志參數(shù)左驾,多個標志使用|分割的方法,如re.compile(r"#[\da-f]{6}\b", re.IGNORECASE|re.MULTILINE)
      2. 通過在正則表達式前面添加(?標志)的方法給正則表達式添加標志,如(?ms)#[\da-z]{6}\b
  2. 常用的標志
      re.A或者re.ASCII极谊, 使\b \B \s \S \w \W \d \D都假定字符串為假定字符串為ASCII
      re.I或者re.IGNORECASE 使正則表達式忽略大小寫
      re.M或者re.MULTILINE 多行匹配诡右,使每個^在每個回車后,每個$在每個回車前匹配
      re.S或者re.DOTALL 使.能匹配任意字符轻猖,包括回車
      re.X或者re.VERBOSE 這樣可以在正則表達式跨越多行帆吻,也可以添加注釋,但是空白需要使用\s或者[ ]來表示咙边,因為默認的空白不再解釋猜煮。如:
      re.compile(r"""<img\s +) #標簽的開始
           [^>]*? #不是src的屬性
           src= #src屬性的開始
           (?:
           (?P<quote>["']) #左引號
           (?P<image_name>[^\1>]+?) #圖片名字
           (?P=quote) #右括號
           """,re.VERBOSE|re.IGNORECASE)

七. Python正則表達式模塊

正則表達式處理字符串主要有四大功能
  1. 匹配 查看一個字符串是否符合正則表達式的語法,一般返回true或者false
  2. 獲取 正則表達式來提取字符串中符合要求的文本
  3. 替換 查找字符串中符合正則表達式的文本败许,并用相應(yīng)的字符串替換
  4. 分割 使用正則表達式對字符串進行分割王带。
Python中re模塊使用正則表達式的兩種方法
  1. 使用re.compile(r, f)方法生成正則表達式對象,然后調(diào)用正則表達式對象的相應(yīng)方法檐束。這種做法的好處是生成正則對象之后可以多次使用辫秧。
  2. re模塊中對正則表達式對象的每個對象方法都有一個對應(yīng)的模塊方法,唯一不同的是傳入的第一個參數(shù)是正則表達式字符串被丧。此種方法適合于只使用一次的正則表達式。
正則表達式對象的常用方法
  1. rx.findall(s,start, end):

返回一個列表绪妹,如果正則表達式中沒有分組甥桂,則列表中包含的是所有匹配的內(nèi)容,
 如果正則表達式中有分組邮旷,則列表中的每個元素是一個元組黄选,元組中包含子分組中匹配到的內(nèi)容,但是沒有返回整個正則表達式匹配的內(nèi)容

  1. rx.finditer(s, start, end):

返回一個可迭代對象
對可迭代對象進行迭代婶肩,每一次返回一個匹配對象办陷,可以調(diào)用匹配對象的group()方法查看指定組匹配到的內(nèi)容,0表示整個正則表達式匹配到的內(nèi)容

  1. rx.search(s, start, end):

返回一個匹配對象,倘若沒匹配到律歼,就返回None
 search方法只匹配一次就停止民镜,不會繼續(xù)往后匹配

  1. rx.match(s, start, end):

如果正則表達式在字符串的起始處匹配,就返回一個匹配對象险毁,否則返回None

  1. rx.sub(x, s, m):

返回一個字符串制圈。每一個匹配的地方用x進行替換们童,返回替換后的字符串,如果指定m鲸鹦,則最多替換m次慧库。對于x可以使用/i或者/g<id>id可以是組名或者編號來引用捕獲到的內(nèi)容。
 模塊方法re.sub(r, x, s, m)中的x可以使用一個函數(shù)馋嗜。此時我們就可以對捕獲到的內(nèi)容推過這個函數(shù)進行處理后再替換匹配到的文本齐板。

  1. rx.subn(x, s, m):

與re.sub()方法相同,區(qū)別在于返回的是二元組葛菇,其中一項是結(jié)果字符串甘磨,一項是做替換的個數(shù)。

  1. rx.split(s, m):

分割字符串
     返回一個列表
      用正則表達式匹配到的內(nèi)容對字符串進行分割
      如果正則表達式中存在分組熟呛,則把分組匹配到的內(nèi)容放在 列表中每兩個分割的中間作為列表的一部分宽档,如:
      rx = re.compile(r"(\d)[a-z]+(\d)")
      s = "ab12dk3klj8jk9jks5"
      result = rx.split(s)
      返回['ab1', '2', '3', 'klj', '8', '9', 'jks5']

  1. rx.flags():

正則表達式編譯時設(shè)置的標志

  1. rx.pattern():

正則表達式編譯時使用的字符串

匹配對象的屬性與方法

1. m.group(g, ...)
  返回編號或者組名匹配到的內(nèi)容,默認或者0表示整個表達式匹配到的內(nèi)容庵朝,如果指定多個吗冤,就返回一個元組
2. m.groupdict(default)
  返回一個字典。字典的鍵是所有命名的組的組名九府,值為命名組捕獲到的內(nèi)容
  如果有default參數(shù)椎瘟,則將其作為那些沒有參與匹配的組的默認值。
3. m.groups(default)
  返回一個元組侄旬。包含所有捕獲到內(nèi)容的子分組肺蔚,從1開始,如果指定了default值儡羔,則這個值作為那些沒有捕獲到內(nèi)容的組的值
4. m.lastgroup()
  匹配到內(nèi)容的編號最高的捕獲組的名稱宣羊,如果沒有或者沒有使用名稱則返回None(不常用)
5. m.lastindex()
  匹配到內(nèi)容的編號最高的捕獲組的編號,如果沒有就返回None汰蜘。
6. m.start(g):
  當(dāng)前匹配對象的子分組是從字符串的那個位置開始匹配的,如果當(dāng)前組沒有參與匹配就返回-1
7. m.end(g)
  當(dāng)前匹配對象的子分組是從字符串的那個位置匹配結(jié)束的仇冯,如果當(dāng)前組沒有參與匹配就返回-1
8. m.span()
  返回一個二元組,內(nèi)容分別是m.start(g)和m.end(g)的返回值
9. m.re()
  產(chǎn)生這一匹配對象的正則表達式
10. m.string()
  傳遞給match或者search用于匹配的字符串
11. m.pos()
  搜索的起始位置族操。即字符串的開頭苛坚,或者start指定的位置(不常用)
12. m.endpos()
  搜索的結(jié)束位置。即字符串的末尾位置色难,或者end指定的位置(不常用)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泼舱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子枷莉,更是在濱河造成了極大的恐慌娇昙,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件依沮,死亡現(xiàn)場離奇詭異涯贞,居然都是意外死亡枪狂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門宋渔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來州疾,“玉大人,你說我怎么就攤上這事皇拣⊙媳停” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵氧急,是天一觀的道長颗胡。 經(jīng)常有香客問我,道長吩坝,這世上最難降的妖魔是什么毒姨? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮钉寝,結(jié)果婚禮上弧呐,老公的妹妹穿的比我還像新娘。我一直安慰自己嵌纲,他們只是感情好俘枫,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逮走,像睡著了一般鸠蚪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上师溅,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天茅信,我揣著相機與錄音,去河邊找鬼墓臭。 笑死汹押,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的起便。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼窖维,長吁一口氣:“原來是場噩夢啊……” “哼榆综!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起铸史,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鼻疮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后琳轿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體判沟,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡耿芹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了挪哄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吧秕。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖迹炼,靈堂內(nèi)的尸體忽然破棺而出砸彬,到底是詐尸還是另有隱情,我是刑警寧澤斯入,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布砂碉,位于F島的核電站,受9級特大地震影響刻两,放射性物質(zhì)發(fā)生泄漏增蹭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一磅摹、第九天 我趴在偏房一處隱蔽的房頂上張望滋迈。 院中可真熱鬧,春花似錦偏瓤、人聲如沸杀怠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赔退。三九已至,卻和暖如春证舟,著一層夾襖步出監(jiān)牢的瞬間硕旗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工女责, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留漆枚,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓抵知,卻偏偏與公主長得像墙基,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子刷喜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

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

  • python的re模塊--細說正則表達式 可能是東半球最詳細最全面的re教程,翻譯自官方文檔,因為官方文檔寫的是真...
    立而人閱讀 22,883評論 4 46
  • Python中的正則表達式(re) import rere.match #從開始位置開始匹配残制,如果開頭沒有則無re...
    BigJeffWang閱讀 7,082評論 0 99
  • re模塊手冊 本模塊提供了和Perl里的正則表達式類似的功能,不關(guān)是正則表達式本身還是被搜索的字符串掖疮,都可以...
    喜歡吃栗子閱讀 4,010評論 0 13
  • 搞懂Python 正則表達式用法 Python 正則表達式 正則表達式是一個特殊的字符序列初茶,它能幫助你方便的檢查一...
    廈熱閱讀 1,583評論 0 2
  • 感覺畫不完都不能安心睡覺,大概這就叫入坑了吧浊闪!哈哈~
    甄甄的小世界閱讀 297評論 2 2