正则表达式-常用的正则-python-dataworks

本文详细介绍了正则表达式的概念、常用符号,以及在阿里云DataWorks中的正则函数,包括re模块的常用函数如match、search、findall、finditer、sub等,以及regexp系列函数如count、extract、instr、replace和substr,同时讨论了贪婪匹配的概念。
部署运行你感兴趣的模型镜像

目录

什么是正则表达式

常用的符号

常用的正则

阿里云dataworks

​​python

python正则匹配函数

常用函数说明

flags参数说明

findall分组说明

无圆括号

一对圆括号

两对圆括号

finditer分组说明

.group()

.groups()

dataworks正则函数

常用函数说明

regexp

命令格式

说明

参数说明

返回值说明

示例

regexp_count

命令格式

说明

参数说明

返回值说明

示例

regexp_extract

命令格式

说明

参数说明

返回值说明

使用示例

regexp_instr

命令格式

说明

参数说明

返回值说明

使用示例

regexp_replace

命令格式

说明

参数说明

返回值说明

使用示例

regexp_substr

命令格式

说明

参数说明

返回值说明

使用示例

特殊说明

贪婪匹配


什么是正则表达式

通过一个表达式,来描述一定的规则,匹配获取需要的字符。

常用的符号

大类

元字符

描述

数字区间

匹配表达式数量

{n,m}

匹配的表达式至少有n个,最多有m个。

n和m的可以为空,如{n,}匹配的字符至少有n个,无上限。

{m}匹配的表达式有m个

符号

匹配表达式数量

?

匹配的表达式为0个或者1个

跟在 (* 、+、?、 {n}、 {n,}、 {n,m})任意一个后面,非贪婪匹配(匹配尽可能少的字符".*?"

.

匹配1个任意字符(除了换行符,注意不是.前面的表达式,是任意的字符)

+匹配的表达式至少有1个
*匹配的表达式至少有0个
特殊符号^

匹配的字符必须以……开始,放置在[]外部

在中括号中使用^时, 表示不匹配某个字符, 比如[^abc]表示不匹配a或b或c

若要不匹配整个字符,则使用?!abc(断言)

$匹配的字符必须以……结束,放置在[]外部
\

转义字符,比如\\n匹配\n

|多项直接选择其中的一个
中括号[]

把一整个表达括起来

[0-9]:匹配0,1,2,3,4,5,6,7,8,9的任意一个数字

[068]:匹配0,6,8的任意一个数字

[a-z]:匹配26个小写英文字符中的任意一个

[A-Z]:匹配26个大写英文字符中的任意一个

小括号()匹配小括号内的表达式,表示一个组
常用\d表匹配的字符的类型必须是数字,通常和{n,m}搭配使用
\D匹配的字符的类型是数字以外的非空字符
\w匹配a-zA-Z0-9的任意一个字符
\W匹配非a-zA-Z0-9的任意非空字符(可以匹配到中文、空格)
\s匹配空字符
\S匹配非空字符
\n匹配换行符
\t匹配制表符

常用的正则

阿里云dataworks

正则类型阿里云dataworks

手机号码

'(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}'
中文'[\\x{4e00}-\\x{9fa5}]'
电话号码

'(0[1-9]\\d{1,2}|00852|00853|00886)-[1-9]\\d{2}'

公民身份号码

'([1-6][1-9]|50)\\d{4}(18|19|20)\\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]'

统一社会信用代码

'[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}'

邮政编码

'[0-8][0-7]\\d{4}'

整型

'(0|-?[1-9]\\d*)'

浮点型

'0|-?([1-9]\\d*\\.\\d*|0\\.\\d*|[1-9]\\d*)'

​​python

正则类型python

手机号码

'(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}'
中文[\u4e00-\u9fa5]
电话号码

'(0[1-9]\d{1,2}|00852|00853|00886)-[1-9]\d{6,7}'

公民身份号码

'([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]'

统一社会信用代码

'[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}'

邮政编码

'[0-8][0-7]\d{4}'

整型

'(0|-?[1-9]\d*)'

浮点型

'(0|-?([1-9]\d*\.\d*|0\.\d*|[1-9]\d*))'

python正则匹配函数

常用函数说明

函数使用方法函数说明
re.compile(pattern)编译正则
re.match(pattern,source,flags=0)从字符串source起始位置匹配pattern,匹配成功返回match对象,否则返回None。
re.search(pattern,source,flags=0)返回第一个成功匹配pattern的子串,匹配成功返回match对象,否则返回None。

re.findall(pattern,source,flags=0)

返回所有匹配pattern的子串列表,pattern中有分组时,只返回匹配到的分组

re.finditer(pattern,source,flags=0)

计返回所有匹配pattern的子串迭代器

使用group():返回匹配整个pattern的子串

使用groups():返回元组,元祖的值为匹配pattern中圆括号的子串。

re.sub(pattern,replace,source,count=0,flags=0)

将字符串source中匹配pattern的数据替换为replace。

count:替换的最大次数,默认为0,替换所有

结果.group()匹配pattern的子串值
结果.start()匹配pattern的子串在source的起始位置,从0开始计算位置
结果.end()匹配pattern的子串在source的结束位置,遵循左闭右开的原则
结果.span()匹配pattern的子串在source的位置:(起始位置,结束位置)元组类型

flags参数说明

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 为了增加可读性,忽略空格和 # 后面的注释

findall分组说明

无圆括号

返回所有匹配pattern的子串列表

import re

source  ='age-18  height-166'
pattern=re.compile(r'\d+')
result1=re.findall(pattern,source)
print(result1) # ['18', '166']

一对圆括号

返回的列表的由匹配pattern中圆括号的子串构成。

 
import re
source  ='age-18  height-166'

pattern=re.compile(r'(age|height)-')
result1=re.findall(pattern,source)
print(result1)#['age', 'height']
 

两对圆括号

返回的列表的由元组构成,元祖的值为匹配pattern中圆括号的子串

import re
source  ='age-18  height-166'

pattern=re.compile(r'(age|height)-(\d+)')
result1=re.findall(pattern,source)
print(result1) #[('age', '18'), ('height', '166')]

finditer分组说明

返回的结果是一个迭代器

.group()

返回的是匹配整个pattern的子串

import re
source  ='age-18  height-166'

pattern=re.compile(r'(age|height)-(\d+)')
result1=re.finditer(pattern,source)
for  i  in result1:
     print(i.group())
#age-18
#height-166

.groups()

返回的是元组,元祖的值为匹配pattern中圆括号的子串。

import re
source  ='age-18  height-166'
pattern=re.compile(r'(age|height)-(\d+)')
result1=re.finditer(pattern,source)
for  i  in result1:
     print(i.groups())    
#('age', '18')
#('height', '166')

dataworks正则函数

常用函数说明

函数使用方法函数说明
source rgexp pattern 判断字符串source是否包含指定规则pattern 。
regexp_count(source,pattern[,start_position])

计算字符串从指定位置开始,匹配指定规则的子串数。

regexp_extract(source,pattern[,groupid])

将字符串按照指定规则拆分为组后,返回指定组的字符串。

groupid为0或大于pattern中分组的个数,返回满足pattern的子串。

groupid的默认值为1。

regexp_insrt(source,pattern[,start_position,occurrence,return_option])

返回字符串从指定位置开始,与指定规则匹配指定次数的子串的起始(return_option=0)或结束位置(return_option=1)。

regexp_replace(source,pattern,replace_string[,occurrence])

将字符串中,与指定规则在指定次数匹配的子串替换为另一字符串。occurrence默认为0,替换所有匹配的子串。

regexp_substr(source,pattern,replace_string[,start_position,occurrence])

从指定位置开始,与指定规则匹配指定次数的子串。occurrence,不指定时默认为1,表示返回第一次匹配的子串

regexp

命令格式

string <source> regexp string <pattern> 

说明

判断字符串source是否包含指定规则pattern 。

参数说明

  • source:必填。STRING类型。待搜索的字符串,其他类型会返回报错。

  • pattern:必填。STRING类型常量或正则表达式。待匹配的模型。pattern为空串(可以为null,返回的是null)或其他类型时返回报错。

返回值说明

  • 如果包含指定规,返回true,否则为false。

  • source、pattern值为NULL时,返回NULL

示例

SELECT  sourece
        ,pattern
        ,sourece REGEXP pattern
FROM    (
            SELECT  "土豆3一斤" sourece,"土豆" pattern -- true
            UNION ALL
            SELECT  "土豆3一斤" sourece," " pattern  -- false
            UNION ALL
            SELECT  "土豆3一斤" sourece,NULL pattern -- null
            UNION ALL
            SELECT  NULL sourece,NULL pattern  -- null
        ) 

regexp_count

命令格式

regexp_count(string <source>, string <pattern>[, bigint <start_position>])

说明

计算字符串source从指定位置start_position开始,匹配指定规则pattern的数量。

参数说明

  • source:必填。STRING类型。待搜索的字符串,其他类型会返回报错。

  • pattern:必填。STRING类型常量或正则表达式。待匹配的模型。pattern为空串(可以为null,返回的是null)或其他类型时返回报错。

  • start_position:可选。BIGINT类型常量,必须大于0。其他类型或值小于等于0时返回报错。不指定时默认为1,表示从source的第一个字符开始匹配。

返回值说明

  • 如果没有匹配成功,返回0。

  • source、pattern或start_position值为NULL时,返回NULL。

  • 返回BIGINT类型。

示例

匹配浮点数

-- 获取整数在字符串中出现的次数
--计算字符串从指定位置开始,匹配指定规则的子串数。
SELECT   REGEXP_COUNT ( sourece ,'[1-9]\\d*' )    --2
        ,REGEXP_COUNT ( sourece ,'[1-9]\\d*' ,6 ) --1
FROM    (
            SELECT  "土豆3一斤,茄子4一斤" sourece
        ) 
;

regexp_extract

命令格式

regexp_extract(string <source>, string <pattern>[, bigint <groupid>])

说明

将字符串source按照pattern的分组规则进行字符串匹配,返回第groupid个组匹配到的字符串内容。

参数说明

  • source:必填。STRING类型,待拆分的字符串。

  • pattern:必填。STRING类型常量或正则表达式。必须有分组,分组用小括号括起来。

  • groupid:可选。BIGINT类型常量,必须大于等于0。默认为1。

返回值说明

返回STRING类型。返回规则如下:

  • 如果pattern为空串或pattern中没有分组,返回报错。

  • groupid非BIGINT类型或小于0时,返回报错。不指定时默认为1,表示返回第一个组。如果groupid等于0或者groupid大于pattern中分组的个数,则返回满足整个pattern的子串。

  • source、pattern或groupid值为NULL时,返回NULL。

使用示例

-- 提取指定组的字符串
-- 将字符串按照指定规则拆分为组后,返回指定组的字符串。
SELECT  regexp_extract(sourece, 'I(.*?)(apple)', 0)    --Ilikeapple
        ,regexp_extract(sourece, 'I(.*?)(apple)',1)    --like
        ,regexp_extract(sourece, 'I(.*?)(apple)',2)    --apple
        ,regexp_extract(sourece, 'I(.*?)(apple)',3)    --Ilikeapple
FROM    (
            SELECT  'Ilikeapple' sourece
        ) 
;

regexp_instr

命令格式

regexp_instr(string <source>, string <pattern>[,bigint <start_position>[, bigint <occurrence>[, bigint <return_option>]]])

说明

计算字符串source从指定位置start_position开始,与指定规则pattern第occurrence次匹配的子串的起始或结束位置加1(return_option为0,起始位置;return_option为1,结束位置)。

参数说明

  • source:必填。STRING类型。源字符串。

  • pattern:必填。STRING类型常量或正则表达式。待匹配的模型。pattern为空串时返回报错。

  • start_position:可选。BIGINT类型常量。搜索的开始位置。不指定时默认值为1

  • occurrence:可选。BIGINT类型常量。指定第几此匹配,不指定时默认值为1,表示搜索第一次出现的位置

  • return_option:可选。BIGINT类型常量。指定返回的位置。值为0或1,不指定时默认值为0,其他类型或不允许的值会返回报错。0表示返回匹配的开始位置,1表示返回匹配的结束位置

    • 注意当return_option的值为1,结束位置是真实的位置加1.

返回值说明

返回BIGINT类型。return_option指定匹配的子串在source中的开始或结束位置。返回规则如下:

  • 若没有匹配到返回0。

  • 如果pattern为空串,返回报错。

  • start_position或occurrence非BIGINT类型或小于等于0时,返回报错。

  • source、pattern、start_position、occurrence或return_option值为NULL时,返回NULL。

使用示例

-- 获取整数所在的位置
-- 返回字符串从指定位置开始,与指定规则匹配指定次数的子串的起始或结束位置。
SELECT  REGEXP_INSTR(sourece, '[1-9]\\d*' ,1,1,0)    --3
        ,REGEXP_INSTR(sourece, '[1-9]\\d*' ,1,1,1)    --5 结束位置应该是4
        ,REGEXP_INSTR(sourece, '[1-9]\\d*' ,1,2,0)    --7
        ,REGEXP_INSTR(sourece, '[1-9]\\d*' ,5,1,0)    --7
        ,LENGTH(sourece)
FROM    (
            SELECT  "猪肉15排骨35" sourece
        ) 
;

regexp_replace

命令格式

regexp_replace(string <source>, string <pattern>, string <replace_string>[, bigint <occurrence>])

说明

        将source字符串中第occurrence次匹配指定规则pattern的子串替换成指定字符replace_string后返回结果字符串。

参数说明

  • source:必填。STRING类型,待替换的字符串。

  • pattern:必填。STRING类型常量或正则表达式。待匹配的模型。pattern为空串时返回报错。

  • replace_string:必填。STRING类型,将匹配pattern的字符串替换后的字符串。

  • occurrence:可选。BIGINT类型常量,必须大于等于0,表示将第occurrence次匹配的字符串替换为replace_string为0时表示替换所有匹配的子串。为其他类型或小于0时,返回报错。默认值为0。

返回值说明

返回STRING类型。返回规则如下:

  • 当引用不存在的组时,不进行替换。

  • 如果replace_string值为NULL且pattern有匹配,返回NULL。

  • 如果replace_string值为NULL但pattern不匹配,返回原字符串。

  • source、pattern或occurrence值为NULL时,返回NULL。

使用示例

-- 排骨替换成猪肉
-- 将字符串中,与指定规则在指定次数匹配的子串替换为另一字符串。
SELECT  REGEXP_REPLACE(sourece, '排骨' ,"猪肉",1)  --猪肉炖粉条红烧排骨
        ,REGEXP_REPLACE(sourece, '排骨' ,"猪肉",2) --排骨炖粉条红烧猪肉
        ,REGEXP_REPLACE(sourece, '排骨' ,"猪肉",0) --猪肉炖粉条红烧猪肉
FROM    (
            SELECT  "排骨炖粉条红烧排骨" sourece
        ) 
;

regexp_substr

命令格式

regexp_substr(string <source>, string <pattern>[, bigint <start_position>[, bigint <occurrence>]])

说明

        返回从start_position位置开始,待搜索的字符串source中第occurrence次匹配指定pattern的子串。

参数说明

  • source:必填。STRING类型。待搜索的字符串。

  • pattern:必填。STRING类型常量或正则表达式。待匹配的模型。

  • start_position:可选。其他BIGINT常量,必须大于0。不指定时默认为1,表示从source的第一个字符开始匹配。

  • occurrence:可选。BIGINT常量,必须大于0。不指定时默认为1,表示返回第一次匹配的子串。

返回值说明

返回STRING类型。返回规则如下:

  • 如果pattern为空串,返回报错。

  • 没有匹配时,返回NULL。

  • start_position或occurrence非BIGINT类型或小于等于0时,返回报错。

  • source、pattern、start_position、occurrence或return_option值为NULL时,返回NULL。

使用示例


-- 获取数字
-- REGEXP_SUBSTR,返回字符串中,从指定位置开始,与指定规则匹配指定次数的子串。
SELECT  REGEXP_SUBSTR(sourece, '[1-9]\\d*' ,1,1)    --15
        ,REGEXP_SUBSTR(sourece, '[1-9]\\d*' ,1,2)    --35 
        ,REGEXP_SUBSTR(sourece, '[1-9]\\d*' ,5,1)    --35
FROM    (
            SELECT  "猪肉15排骨35" sourece
        ) 
;

特殊说明

贪婪匹配

在正则表达式中,贪婪匹配是指匹配尽可能多的字符,而非贪婪匹配(也称为懒惰匹配或最小匹配)则是匹配尽可能少的字符。如下面代码块(python)所示,贪婪匹配和非贪婪匹配的区别

import re

text = "Hello, my name is John. Hello John,Nice to meet you, John."
pattern_max = r'my.*John'  # 贪婪匹配
match_max = re.search(pattern_max, text)
print(match_max.group())
# my name is John. Hello John,Nice to meet you, John

pattern_min = r'my.*?John'  # 非贪婪匹配
match_min = re.search(pattern_min, text)
print(match_min.group())
#my name is John

文章部分内容来源于MaxComputeSQL支持的字符串函数的命令格式,参数及示例_云原生大数据计算服务 MaxCompute-阿里云帮助中心

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值