python正則表達式(8)--分組、後向引用、前(後)向斷言

無名、有名分組

(1)正則表達式—無名分組

從正則表 達式的左邊開始看,看到的第一個左括號「(」表示表示第一個分組,第二個表示第二個分組, 依次類推。正則表達式

須要注意的是,有一個隱含的全局分組(就是索引號爲0的分組),就是整個正則 表達式匹配的結果緩存

 

(2)正則表達式—有名分組

命名分組就是給具體有默認分組編號的組另外再起一個別名,方便之後的引用。 命令分組的語法格式以下: (?P<name>正則表達式)索引

 

語法格式中的字符P必須是大寫的「P」,name是一個合法的標識符,表示分組的別名。ip

s = "ip='230.192.168.78',version='1.0.0'"字符串

res = re.search(r"ip='(?P<ip>\d+\.\d+\.\d+\.\d+).*", s)io

print res.group('ip')#經過命名分組引用分組ast

 

正則表達式—後向引用

當用「()」定義了一個正則表達式分組後,正則引擎就會把匹配的組按照順序進行編號,而後存 入緩存中。這樣咱們就能夠在後面對已經匹配過的內容進行引用,這就叫後向引用。import

(1)經過索引引用

\數字 \1表示引用第一個分組,\2引用第二個分組,以此類推,\n引用第n個組,而\0則表示引用整個 被匹配的正則表達式自己。module

 

交換字符串的位置object

import re

s = 'abc.xyz' # 交換.號兩邊的字符串

res = re.sub(r'(.*)\.(.*)', r'\2.\1', s)

print res

>>>xyz.abc

 

(2) (?P=name)經過命名分組名進行引用

(?P=name) 字符P必須是大寫的P,name表示命名分組的分組名

 

(?P<name>)(?P=name) 引用分組的值匹配值必須與第一個分組匹配值相等才能匹配到

例如:

1)    引用前一個分組,先後值相同都是2,故能匹配到

>>> re.match(r'(?P<xst>\d)(?P=xst)','22').groups()

('2',)

>>> re.match(r'(?P<xst>\d)(?P=xst)','22').group()

'22'

2)    引用前一個分組,先後值不相同分別爲2和3,故不能匹配到

>>> re.match(r'(?P<xst>\d)(?P=xst)','23').group()

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

AttributeError: 'NoneType' object has no attribute 'group'

 

正則表達式—先後向斷言

(1)前向確定斷言與後向確定斷言

1)    前向確定斷言的語法:

(?<=pattern) 前向確定斷言表示你但願匹配的字符串前面是pattern匹配的內容時,才匹配。

2)    後向確定斷言的語法:

(?=pattern) 後向確定斷言表示你但願匹配的字符串的後面是pattern匹配的內容時,才匹配

 

3)先後向斷言同時使用

若是在一次匹配過程當中,須要同時用到前向確定斷言和後向確定斷 言時,那你必須將前向確定斷言表達式寫在要匹配的正則表達式的前面,然後向確定斷言表 達式寫在你要匹配的字符串的後面

 

(2) 前向否認斷言與後向否認斷言

1) 前向否認斷言的語法:

(?<!pattern) 前向否認斷言表示你但願匹配的字符串的前面不是pattern匹配的內容時,才匹配.

2) 後向否認斷言的語法:

(?!pattern) 後向否認斷言表示你但願匹配的字符串後面不是pattern匹配的內容時,才匹配。

 

(3)注意

前向確定(否認)斷言括號中的正則表達式必須是能肯定長度的正則表達式,好比\w{3},而不能寫成 \w*或者\w+或者\w?等這種不能肯定個數的正則模式符。

相關文章
相關標籤/搜索