Python學習筆記之正則表達式


正則表達式:匹配文本片段的模式。

  • 通配符:匹配多於一個的字符串。如‘.’可以匹配除換行符之外所有字符,只能匹配一個字符。
  • 對特殊字符進行轉義:假如要對字符串‘Python.org’進行匹配,如果直接使用‘python.org’進行匹配,則不僅會匹配到'python.org',還會有'pythoniorg'等其他字符串,此時需要對‘'.'進行轉義,使用‘python\\.org’或者r'python\.org'進行匹配。
  • 字符集:使用中括號來創建字符集,其中包括所有你想要匹配到的字符,如‘[pj]ython’可以匹配到'python'和'jython','[a-zA-Z0-9]'能匹配任意大小寫字母和數字,字符集只能匹配一個字符。反轉字符集,如'[^abc]'表示可以匹配除a、b、c之外的所有字符。
  • 選擇符和子模式:管道符號‘|',用於選擇,如只匹配‘Python’和‘jython’,則使用‘Python|jython進行匹配,或者只對模式的一部分使用選擇運算符,如'(P|j)ython',使用圓括號括起需要的部分,稱子模式,
  • 可選項和重復子模式:在子模式后面加上問號就變成了可選項,如r‘(http://)?(www\.)?python\.org’可匹配到以‘http://www.’、‘‘http:’、‘www.’開頭以及'python.org'這些字符串。問號表示允許子模式出現0次或一次。

    (pattern)*:允許子模式出現0次或多次

    (pattern)+:允許子模式出現1次或多次

    (pattern){m,n}:允許模式重復m到n次

  • 字符串的開始和結尾:前面的都是針對整個字符串進行匹配,如果要針對字符串開始或者結尾進行匹配則需要使用‘^’標記,如‘^ht+p’只匹配字符串開始的'ht+p'字符,限定字符串結尾匹配則使用‘$’標識

 

re模塊的常用函數

函數 描述
compile(pattern[,flags])

根據包含正則表達式的字符串創建模式對象

search(pattern,string[,flags])

在字符串中尋找模式

match(pattern,string[,flags])

在字符串開始處匹配模式

split(pattern,string[,maxsplit = 0])

根據模式的匹配項來分割字符串

findall(pattern,string)

列出字符串中模式的所有匹配項

sub(pat,repl,string[,count = 0])

將字符串中所有pat的匹配項用repl替換

escape(string)

將字符串中所有特殊正則表達式字符轉義

對於re模塊中的匹配函數而言,匹配成功則返回MatchObject對象,這些對象包括匹配模式的子字符串信息,還包含了哪個模式匹配了哪部分的信息,這些“部分”叫做組,組就是放置在元組括號內的子模式。

模式‘there (was a (wee) (cooper)) who (lived in fyfe)’包含以下組:

0 there was  a wee cooper who lived in fyfe

1  was  a wee cooper

2 wee

3 cooper

4 lived in fyfe

re匹配對象的重要方法:

方法

描述

group([group1,……])

獲取給定子模式(組)的匹配項

start([group])

返回給定組的匹配項的開始位置

end([group])

返回給定組的匹配項的結束位置

span([group])

返回一個組的開始和結束位置

>>> import re
>>> m = re.match('www\.(.*)\..{3}','www.python.org')
>>> g1 = m.group(1)
>>> m.group(1)
'python'
>>> m.end(1)
10
>>> m.span(1)
(4, 10)
>>> m.group(0)
'www.python.org'

 

在重復運算符后增加一個‘?’就把重復運算變成非貪婪版本

 

re.split()函數進行切割時,如果模式中含有小括號,那么小括號中內容將會在每一個子字符串之間存在。

re.split(pattern,string[,maxsplit = 0])

 

 

split函數還有一個限制分割次數的參數maxsplit

 

re.findall函數以列表形式返回給定模式的所有的匹配項。

re.findall(pattern,str)

 

對於findall函數,有一個小坑,在提取數據時注意括號的使用。

#findall函數的提取數據內容實際是模式內括號的內容

>>> re.findall(r'hello(.*?)world',"hello xyz world")
[' xyz ']

>>> re.findall(r'hello .*? world',"hello xyz world")
['hello xyz world']

 

re.sub()函數使用指定內容替換匹配到的最左端並且非重疊的子字符串。

re.sub(pat,repi,str[,count = 0])

sub()函數可以通過組來替換,在替換內容中使用‘\\n’形式出現的任何轉義序列都會被模式中與組n匹配的字符串替換掉。

例如將文本中的*something*替換成<em>something</em>

>>> pat = r'\*([^\*]+)\*'
>>> re.sub(pat,r'<em>\1</em>','hello *world*!')
'hello <em>world</em>!'
 

>>> pat =re.compile(r'\*([^\*]+)\*')
>>> re.sub(pat,r'<em>\1</em>','hello *world*!')
'hello <em>world</em>!'

重復運算符是貪婪的,它會進行盡可能多的匹配。

>>> pat = r'\*(.+)\*'
>>> re.sub(pat,r'<em>\1</em>','hello *world*!')
'hello <em>world</em>!'
>>> re.sub(pat,r'<em>\1</em>','*hello* *world*!')
'<em>hello* *world</em>!'

此時就需要用到非貪婪模式,即在重復匹配符后面增加一個‘?’

>>> pat = r'\*(.+?)\*'
>>> re.sub(pat,r'<em>\1</em>','hello *world*!')
'hello <em>world</em>!'
>>> re.sub(pat,r'<em>\1</em>','*hello* *world*!')
'<em>hello</em> <em>world</em>!'

 

點擊查看re.sub()函數詳解

 re.escape函數是一個是一個將所有可能被解釋為正則運算符的字符進行轉義的函數。

>>> re.escape('hello.python')
'hello\\.python'

 

正則從暑假看到現在,斷斷續續,不要放棄啊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM