PythonRegex學習摘要及資料

來源:互聯網
上載者:User

標籤:tutorial   close   技術   傳回值   迭代器   with   developer   develop   轉化   

摘要
  • 在Regex中,如果直接給出字元,就是精確匹配。

  • {m,n}? 對於前一個字元重複 到 n 次,並且取儘可能少的情況 在字串‘aaaaaa‘中,a{2,4} 會匹配 4 個 a,但 a{2,4}? 只匹配 2 個 a

^表示行的開頭,^\d表示必須以數字開頭。

$表示行的結束,\d$表示必須以數字結束。

你可能注意到了,py也可以匹配‘python‘-->py;
但是加上^py$就變成了整行匹配,就只能匹配‘py‘了,匹配‘python‘時,就什麼也得不到。

參考表Regex特殊序列

re模組

re.compile(pattern[, flags])
把Regex的模式和標識轉化成Regex對象,供 match() 和 search() 這兩個函數使用。

re 所定義的 flag 包括:

re.I 忽略大小寫re.L 表示特殊字元集 \w, \W, \b, \B, \s, \S 依賴於當前環境re.M 多行模式re.S 即為’ . ’並且包括分行符號在內的任一字元(’ . ’不包括分行符號)re.U 表示特殊字元集 \w, \W, \b, \B, \d, \D, \s, \S 依賴於 Unicode 字元屬性資料庫re.X 為了增加可讀性,忽略空格和’ # ’後面的注釋

以下兩種用法結果相同:(A)

compiled_pattern = re.compile(pattern) result = compiled_pattern.match(string)

(B)

result = re.match(pattern, string)
s = ‘ABC\\-001‘ # Python的字串 #對應的Regex字串變成: #‘ABC\-001‘

因此我們強烈建議使用Python的r首碼,就不用考慮轉義的問題了

s = r‘ABC\-001‘ # Python的字串# 對應的Regex字串不變:# ‘ABC\-001‘
search

re.search(pattern, string[, flags])`
在字串中尋找匹配Regex模式的位置,返回 MatchObject 的執行個體,如果沒有找到匹配的位置,則返回 None
對於已編譯的Regex對象來說(re.RegexObject),有以下 search 的方法:
search (string[, pos[, endpos]])
 regex 是已編譯好的Regex對象,regex.search(string, 0, 50) 等同於 regex.search(string[:50], 0)

 >>> pattern = re.compile("a")  >>> pattern.search("abcde")     # Match at index 0  >>> pattern.search("abcde", 1)  # No match;
match

re.match(pattern, string[, flags])
判斷 pattern 是否在字串開頭位置匹配。對於 RegexObject,有:
match(string[, pos[, endpos]])
match() 函數只在字串的開始位置嘗試匹配Regex,也就是只報告從位置 0 開始的匹配情況,而 search() 函數是掃描整個字串來尋找匹配。如果想要搜尋整個字串來尋找匹配,應當用 search()。

>>> pattern.match(‘bca‘,2).group()‘a‘

雖然,match預設是從開頭匹配,但是,如果指定位置,仍然能成功;但是!match也是從指定位置開始匹配,不匹配仍然會失敗,這一點就和search有區別啦。

match()方法判斷是否匹配,如果匹配成功,返回一個Match對象,否則返回None

test = ‘使用者輸入的字串‘if re.match(r‘Regex‘, test):    print(‘ok‘)else:    print(‘failed‘)
split

re.split(pattern, string[, maxsplit=0, flags=0])
此功能很常用,可以將將字串匹配Regex的部分割開並返回一個列表。對 RegexObject,有函數:
split(string[, maxsplit=0])

對於一個找不到匹配的字串而言,split 不會對其作出分割

>>> ‘a b   c‘.split(‘ ‘)[‘a‘, ‘b‘, ‘‘, ‘‘, ‘c‘]

這裡用字串內建的split方法就很不靈活。

>>> re.split(r‘\s+‘, ‘a b   c‘)[‘a‘, ‘b‘, ‘c‘]

看出差別了吧,很強大!再來一個終極的:

>>> re.split(r‘[\s\,\;]+‘, ‘a,b;; c  d‘)[‘a‘, ‘b‘, ‘c‘, ‘d‘]

r‘[\s\,\;]+‘的正則表達式意思為:空格或者,或者;`出現1次或1次以上都是滿足條件的分割符號!所以,最後結果還是很乾淨。

findall

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

在字串中找到Regex所匹配的所有子串,並組成一個列表返回。同樣 RegexObject 有:
findall(string[, pos[, endpos]])

 #get all content enclosed with [], and return a list >>> pattern=re.compile(r‘hh‘)>>> pattern.findall(‘hhmichaelhh‘)[‘hh‘, ‘hh‘]
finditer

re.finditer(pattern, string[, flags])
和 findall 類似,在字串中找到Regex所匹配的所有子串,並組成一個迭代器返回。同樣 RegexObject有:
finditer(string[, pos[, endpos]])

sub

re.sub(pattern, repl, string[, count, flags])
在字串 string 中找到匹配Regexpattern 的所有子串,用另一個字串 repl 進行替換。如果沒有找到匹配 pattern 的串,則返回未被修改的 string。Repl 既可以是字串也可以是一個函數。

傳回值是替換後的新字串。

對於 RegexObject 有:
sub(repl, string[, count=0])

>>> pattern=re.compile(r‘\d‘)>>> pattern.sub(‘no‘,‘12hh34hh‘)‘nonohhnonohh‘>>> pattern.sub(‘no‘,‘12hh34hh‘,0)‘nonohhnonohh‘>>> pattern.sub(‘no‘,‘12hh34hh‘,count=0)‘nonohhnonohh‘>>> pattern.sub(‘no‘,‘12hh34hh‘,1)‘no2hh34hh‘

通過上面的例子,可以看出,count是可以預設的,同時,預設值是0,表示全部替換;否則,就是指定替換幾個。

subn

re.subn(pattern, repl, string[, count, flags])
該函數的功能和 sub() 相同,但它還返回新的字串以及替換的次數。同樣 RegexObject 有:
subn(repl, string[, count=0])

>>> pattern.subn(‘no‘,‘12hh34hh‘,count=0)(‘nonohhnonohh‘, 4)
分組

除了簡單地判斷是否匹配之外,Regex還有提取子串的強大功能。用()表示的就是要提取的分組(Group)。比如:

^(\d{3})-(\d{3,8})$分別定義了兩個組,可以直接從匹配的字串中提取出區號和本地號碼:

>>> m = re.match(r‘^(\d{3})-(\d{3,8})$‘, ‘010-12345‘)>>> m<_sre.SRE_Match object; span=(0, 9), match=‘010-12345‘>>>> m.group(0)‘010-12345‘>>> m.group(1)‘010‘>>> m.group(2)‘12345‘>>> m.groups()(‘010‘, ‘12345‘)

通過實驗,如果不用括弧,得到的Match對象課可以使用例如a.group(0)或者a.group()但是,使用a.group(1)就會報錯的。

貪婪匹配

正則匹配預設是貪婪匹配,也就是匹配儘可能多的字元。舉例如下,匹配出數字後面的0

>>> re.match(r‘^(\d+)(0*)$‘, ‘102300‘).groups()(‘102300‘, ‘‘)

由於\d+採用貪婪匹配,直接把後面的0全部匹配了,結果0*只能匹配Null 字元串了。

必須讓\d+採用非貪婪匹配(也就是儘可能少匹配),才能把後面的0匹配出來,加個?就可以讓\d+採用非貪婪匹配:

>>> re.match(r‘^(\d+?)(0*)$‘, ‘102300‘).groups()(‘1023‘, ‘00‘)
PythonRegex學習資源

  • 廖雪峰-Regex
  • IBM-使用 Python 模組 re 實現解析小工具
  • deerchao-則運算式30分鐘入門教程
  • deerchao-Regex30分鐘入門教程
  • 靜覓-爬蟲入門七之Regex

原文連結:--By Michael翔

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.