正規表示式 二 子表示式及反向引用

2021-09-26 22:17:47 字數 3740 閱讀 7933

1.子表示式

子表示式通常作為更長的表示式的一部分,子表示式可以作為單一的實體來使用。 子表示式由()來定義。前文說過,表示重複次數的元字元只能作用於緊挨著它的前乙個字元,引入子表示式之後,就可以讓子表示式作為乙個整體重複多次。python和hive中都有語法幫助我們提取出子表示式匹配的內容。

python版本:

import re

result=re.search(r'(\d)-(\d)','0571-68819999')

print(result.groups())

實驗結果:

('0571', '68819999')
hive版本:

select '0' as num, regexp_extract('0571-68819999','^(\\d)-(\\d)$',0) as result

union

select '1' as num, regexp_extract('0571-68819999','^(\\d)-(\\d)$',1) as result

union

select '2' as num, regexp_extract('0571-68819999','^(\\d)-(\\d)$',2) as result

**結果如下:(從實驗結果可以看出,hive中分組的索引是從1開始的,0對應的是完整匹配

numresult

00571-68819999

10571

268819999

子表示式是支援巢狀的,但是巢狀之後各個表示式的索引會容易引起混亂。

python版本:

import re

str_1='135-0577-2345'

match=re.search(r'(((\d)-(\d))-(\d))',str_1)

print(match.groups())

**結果:

('135-0577-2345', '135-0577', '135', '0577', '2345')
從結果和其對應的索引關係可以看出,索引編號是從外到內,從左到右,深度優先

hive版本:

select '1' as num, regexp_extract('135-0577-2345','(((\\d)-(\\d))-(\\d))',1) as result

union

select '2' as num, regexp_extract('135-0577-2345','(((\\d)-(\\d))-(\\d))',2) as result

union

select '3' as num, regexp_extract('135-0577-2345','(((\\d)-(\\d))-(\\d))',3) as result

union

select '4' as num, regexp_extract('135-0577-2345','(((\\d)-(\\d))-(\\d))',4) as result

union

select '5' as num, regexp_extract('135-0577-2345','(((\\d)-(\\d))-(\\d))',5) as result

**結果如下:(hive中的索引和python中的索引順序一致)

numresult

1135-0577-2345

2135-0577

3135

40577

52345

2. 反向引用

反向引用允許正規表示式模式引用之前匹配的結果。反向引用需要結合字表示式一起使用。這個主要用來匹配需要成對出現的模式。以乙個python程式為例(**中的\1表示引用分組索引為1的匹配結果):

import re

str_1=''

str_2='

null

hive和mysql中也支援反向引用。注意,我用的mysql8.0版本,在其他書上看到mysql5版本可能是不支援反向引用的。

select '1' as num, '' regexp '<(h[1-6])>\\w+' as result

union

select '2' as num, 'hello123world' regexp '<(h[1-6])>\\w+' as result

hive執行結果如下:

numresult

1true

2false

3. mysql8.0中支援的正規表示式函式

namedescription

regexp

字串中是否有與模式匹配的子串,如果有返回1或true,沒有返回0或false。

not regexp

將 regexp表達的結果置反。

regexp_like

與regexp結果相同。

rlike

與regexp結果相同。

regexp_instr

返回字串中與模式匹配的子串的開始索引位置,若沒有子串與模式匹配,則返回0。

regexp_replace

將字串中與模式匹配的子串替換成其他字串。

regexp_substr

返回字串中與模式匹配的子串。

regexp_like**(mysql中字串索引從1開始):

select '1' as num,regexp_instr('hello123world456','[0-9]+') as result

union all

-- 引數7用來指定開始搜尋的位置,不寫預設為1

select '2' as num,regexp_instr('hello123world456','[0-9]+',7) as result

union all

-- 引數2的作用:當字串中有多個子串與模式匹配是時,定位到第2個與模式匹配的子串,返回該子串的起始索引

select '3' as num,regexp_instr('hello123world456','[0-9]+',1,2)as result

union all

select '4' as num,regexp_instr('hello123world456hello123','[0-9]+',1,3)as result

結果如下:

numresult16

27314

422regexp_replace\substr()**:

select '1' as num,regexp_replace('hello123world','[0-9]+',' ') as result

union all

select '2' as num,regexp_substr('hello123world','[0-9]+') as result

結果如下:

numresult

1hello world

2123

正規表示式(1):

轉義字元:

表示式反向解析 正規表示式 反向引用

分組不僅用在匹配結果中,也可以在匹配的正規表示式中使用分組匹配的結果,這種功能稱為反向引用 backreference 當待匹配的字串中有些子字串出現多次的話,正規表示式模式可以將第乙個出現的子字串儲存在分組中,在模式的後面可以直接引用第乙個匹配的結果。因為分組即可通過索引也可以通過名字來訪問,所以...

正規表示式反向引用

微軟關於正規表示式的反向引用的官方文件 1 第1個 代表任意字元,後面的 代表 前面的任意字元有0個或多個 第2個 也代表任意字元,但它被括號括起來了,括號代表它 獲了,相當於被複製了,還沒被貼上 第3個 也代表任意字元,後面的 代表 前面的任意字元有0個或多個 第1個 代表轉譯符,這個符號不能直接...

正規表示式的反向引用

其實,小括號包含的表示式所匹配到的字串 不僅是在匹配結束後才可以使用,在匹配過程中也可以使用。表示式後邊的部分,可以引用前面 括號內的子匹配已經匹配到的字串 引用方法是 加上乙個數字。1 引用第1對括號內匹配到的字串,2 引用第2對括號內匹配到的字串 以此類推,如果一對括號內包含另一對括號,則外層的...