目录
什么是正则表达式
通过一个表达式,来描述一定的规则,匹配获取需要的字符。
常用的符号
| 大类 | 元字符 | 描述 |
| 数字区间 匹配表达式数量 | {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-阿里云帮助中心
本文详细介绍了正则表达式的概念、常用符号,以及在阿里云DataWorks中的正则函数,包括re模块的常用函数如match、search、findall、finditer、sub等,以及regexp系列函数如count、extract、instr、replace和substr,同时讨论了贪婪匹配的概念。
786

被折叠的 条评论
为什么被折叠?



