根據(jù)前面的介紹嫌吠,對分組的引用可能出現(xiàn)在三種場合:
- 在匹配完之后止潘,用
group(num)
之類的方法提取數(shù)據(jù) - 在進(jìn)行正則表達(dá)式替換時,用
\num
引用 - 在正則表達(dá)式內(nèi)部辫诅,用
\num
引用
但是使用\num
凭戴,有可能遇到二義性的問題:如果出現(xiàn)了\10
,它表示第10個捕獲分組的引用炕矮?還是第一個捕獲分組\1
后跟著一個字符0
么夫?
例3-28 可能具有二義性的反向引用
re.sub(r'(\d)', r'\10', '123')
# sre_constants.error: invalid group reference
原來\10
會被解釋成“第10個捕獲分組匹配的文本”,而不是“第一個捕獲分組匹配的文本之后加上字符0”肤视。如果我們希望做到后面這種情況魏割,python提供了\g<num>
表示法,將\10
改寫成\g<1>0
钢颂,避免了二義性的問題钞它。
例3-29 使用\g<num>
消除二義性
re.sub(r'(\d)', r'\g<1>m', '123') # 1m2m3m
PHP中也有專門的記法解決這類問題,在替換時可以使用\${num}
的寫法,準(zhǔn)確標(biāo)注所引用分組的編號遭垛,也就是說\${1}0
表示“第一個捕獲分組之后加上0”尼桶,${10}
表示“第10個捕獲分組”。而$10
锯仪,在第10和捕獲分組存在的情況下泵督,表示該分組;否則視為空字符串庶喜。
Python和PHP中的規(guī)定明確小腊,所以避免了\num
的二義性;其他語言卻不是如此久窟,根據(jù)它們的文檔秩冈,引用捕獲分組只有\num
(或$num
)一種記法,這時\10
的二義性就無法避免了斥扛。
比如Java對\num
中對num
是這樣定義的:**如果是一位數(shù)入问,則引用對應(yīng)的捕獲分組;如果是兩位數(shù)且存在對應(yīng)的捕獲分組時稀颁,引用對應(yīng)的捕獲分組芬失,否則引用一位數(shù)編號的捕獲分組。