pythonRegex

來源:互聯網
上載者:User

標籤:findall   zhang   括弧   貪婪   要求   mat   c++   運算式   str   

re模組操作

在Python中需要通過Regex對字串進行匹配的時候,可以使用一個模組,名字為re

1. re模組的使用過程
    #coding=utf-8    # 匯入re模組    import re    # 使用match方法進行匹配操作    result = re.match(Regex,要匹配的字串)    # 如果上一步匹配到資料的話,可以使用group方法來提取資料    result.group()
re.match是用來進行正則匹配檢查的方法,若字串匹配Regex,則match方法返回匹配對象(Match Object),否則返回None(注意不是Null 字元串"")。匹配對象Macth Object具有group方法,用來返回字串的匹配部分。

Regex的單字元匹配

字元 功能
. 匹配任意1個字元(除了\n)
[ ] 匹配[ ]中列舉的字元
\d 匹配數字,即0-9
\D 匹配非數字,即不是數字
\s 匹配空白,即 空格,tab鍵
\S 匹配非空白
\w 匹配單詞字元,即a-z、A-Z、0-9、_
\W 匹配非單詞字元
2. 原始字串

說明

Python中字串前面加上 r 表示原生字串

與大多數程式設計語言相同,Regex裡使用"\"作為逸出字元,這就可能造成反斜線困擾。假如你需要匹配文本中的字元"\",那麼使用程式設計語言表示的Regex裡將需要4個反斜線"\\":前兩個和後兩個分別用於在程式設計語言裡轉義成反斜線,轉換成兩個反斜線後再在Regex裡轉義成一個反斜線。

Python裡的原生字串很好地解決了這個問題,有了原始字串,你再也不用擔心是不是漏寫了反斜線,寫出來的運算式也更直觀。

表示數量

匹配多個字元的相關格式

字元 功能
* 匹配前一個字元出現0次或者無限次,即可有可無
+ 匹配前一個字元出現1次或者無限次,即至少有1次
? 匹配前一個字元出現1次或者0次,即要麼有1次,要麼沒有
{m} 匹配前一個字元出現m次
{m,} 匹配前一個字元至少出現m次
{m,n} 匹配前一個字元出現從m到n次
表示邊界
字元 功能
^ 匹配字串開頭
$ 匹配字串結尾
\b 匹配一個單詞的邊界
\B 匹配非單詞邊界
匹配分組
字元 功能
| 匹配左右任意一個運算式
(ab) 將括弧中字元作為一個分組
\num 引用分組num匹配到的字串
(?P<name>) 分組起別名
(?P=name) 引用別名為name分組匹配到的字串
re模組的進階用法search

需求:匹配出文章閱讀的次數

#coding=utf-8import reret = re.search(r"\d+", "閱讀次數為 9999")ret.group()

findall

需求:統計出python、c、c++相應文章閱讀的次數

#coding=utf-8import reret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")print ret

sub 將匹配到的資料進行替換

需求:將匹配到的閱讀次數加1

方法1:

#coding=utf-8import reret = re.sub(r"\d+", ‘998‘, "python = 997")print ret

方法2:

#coding=utf-8import redef add(temp):    strNum = temp.group()    num = int(strNum) + 1    return str(num)ret = re.sub(r"\d+", add, "python = 997")print retret = re.sub(r"\d+", add, "python = 99")print ret

split 根據匹配進行切割字串,並返回一個列表

需求:切割字串“info:xiaoZhang 33 shandong”

#coding=utf-8import reret = re.split(r":| ","info:xiaoZhang 33 shandong")print ret

python貪婪和非貪婪

Python裡數量詞預設是貪婪的(在少數語言裡也可能是預設非貪婪),總是嘗試匹配儘可能多的字元;

非貪婪則相反,總是嘗試匹配儘可能少的字元。

在"*","?","+","{m,n}"後面加上?,使貪婪變成非貪婪。

>>> s="This is a number 234-235-22-423">>> r=re.match(".+(\d+-\d+-\d+-\d+)",s)>>> r.group(1)‘4-235-22-423‘>>> r=re.match(".+?(\d+-\d+-\d+-\d+)",s)>>> r.group(1)‘234-235-22-423‘>>>

Regex模式中使用到通配字,那它在從左至右的順序求值時,會盡量“抓取”滿足匹配最長字串,在我們上面的例子裡面,“.+”會從字串的啟始處抓取滿足模式的最長字元,其中包括我們想得到的第一個整型欄位的中的大部分,“\d+”只需一位字元就可以匹配,所以它匹配了數字“4”,而“.+”則匹配了從字串起始到這個第一位元字4之前的所有字元。

解決方式:非貪婪操作符“?”,這個操作符可以用在"*","+","?"的後面,要求正則匹配的越少越好。

 

pythonRegex

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.