正则表达式:修订间差异
无编辑摘要 |
无编辑摘要 |
||
(未显示同一用户的1个中间版本) | |||
第7行: | 第7行: | ||
一个正则表达式通常被称为一个模式(pattern),为用来描述或者匹配一系列符合某个句法规则的字符串。如this, that都可以由<code>th(is|at)</code>这个模式来描述。 | 一个正则表达式通常被称为一个模式(pattern),为用来描述或者匹配一系列符合某个句法规则的字符串。如this, that都可以由<code>th(is|at)</code>这个模式来描述。 | ||
正则表达式由普通字符,比如:abc;或者是简单字符和特殊字符的组合,比如ab\*c。 | 正则表达式由普通字符,比如:abc;或者是简单字符和特殊字符的组合,比如ab\*c。 | ||
===元字符=== | |||
特殊字符是由元字符或元字符和普通字符构成,比如\d表示匹配一个数字。元字符是有特殊意义的字符,它们被作为一般的字符使用时,必须要通过“转义”(前面加一个反斜杠“\”)来去除他们本身的特殊意义,这14个元字符如下: | |||
<nowiki>. ^ $ * + ? { } [ ] \ | ( )</nowiki> | <nowiki>. ^ $ * + ? { } [ ] \ | ( )</nowiki> | ||
===字符类=== | |||
{| class="wikitable" | {| class="wikitable" | ||
! 特殊字符 | ! 特殊字符 | ||
! 含义 | ! 含义 | ||
! 示例 | ! 示例 | ||
|- | |- | ||
| \ | | . | ||
| | | 默认匹配除换行符之外的任何单个字符。如果指定了参数DOTALL ,它将匹配包括换行符的任意字符。 | ||
| \\ 匹配 \ | | .n 匹配 "nay, an apple is on the tree" 中的 'an' 和 'on'. | ||
|- | |||
| \d | |||
| 匹配一个数字。等价于[0-9]。 | |||
| \d 匹配"B2 is the suite number."中的'2'。 | |||
|- | |||
| \D | |||
| 匹配一个非数字字符。等价于[^0-9]。 | |||
| \D 匹配"B2 is the suite number."中的'B' 。 | |||
|- | |||
| \w | |||
| 匹配一个单字字符(字母、数字或者下划线)。等价于 [A-Za-z0-9_]。 | |||
| \w 匹配 "apple," 中的 'a'和 | |||
|- | |||
| \W | |||
| 匹配一个非单字字符。等价于 [^A-Za-z0-9_]。 | |||
| \W匹配 "50%." 中的 '%'。"$5.28,"中的 '5'。 | |||
|- | |||
| \s | |||
| 匹配一个空白字符,包括空格、制表符、换页符和换行符。 | |||
| \s\w*匹配"foo bar."中的' bar'。 | |||
|- | |||
| \S | |||
| 匹配一个非空白字符。 | |||
| \S\w* 匹配"foo bar."中的'foo' | |||
|- | |||
| [字符集] | |||
| 匹配方括号中的任意一个字符。特殊符号"\ * . "在字符集没有特殊意义。可以使用破折号(-)来指定一个字符范围。 | |||
| [abcd] 和[a-d]是一样的,可以匹配"brisket"中的‘b’和“city”中的‘c’。 | |||
|- | |- | ||
| ^ | | [^字符集] | ||
| | | 反向字符集,匹配任何没有包含在方括号中的字符。可以使用破折号(-)来指定一个字符范围。任何普通字符在这里都是起作用的。 | ||
| [^abc] 和 [^a-c] 是一样的。可以匹配"brisket"中的‘r’和匹配“chop”中的‘h’。 | |||
|- | |- | ||
| | | | ||
| | | | ||
| | | | ||
|} | |||
===数量词=== | |||
{| class="wikitable" | |||
! 特殊字符 | |||
! 含义 | |||
! 示例 | |||
|- | |- | ||
| * | | * | ||
第43行: | 第78行: | ||
| 匹配前面一个表达式 0 次或者 1 次。等价于 {0,1}。还用于先行断言中,如本表的 x(?=y) 和 x(?!y) 条目所述。 | | 匹配前面一个表达式 0 次或者 1 次。等价于 {0,1}。还用于先行断言中,如本表的 x(?=y) 和 x(?!y) 条目所述。 | ||
| e?le? 匹配 "angel" 中的 'el'、"angle" 中的 'le' 以及 "oslo' 中的 'l'。 | | e?le? 匹配 "angel" 中的 'el'、"angle" 中的 'le' 以及 "oslo' 中的 'l'。 | ||
|- | |- | ||
| {n} | | {n} | ||
第59行: | 第90行: | ||
| m 和 n 均为非负整数,匹配前面的字符至少n次,最多m次。如果 n 或者 m 的值是0, 这个值被忽略。 | | m 和 n 均为非负整数,匹配前面的字符至少n次,最多m次。如果 n 或者 m 的值是0, 这个值被忽略。 | ||
| a{1, 3} 匹配“candy”中的a和“caandy”中的'aa'和“caaaandy”中的前面'aaa',但不匹配“cndy”中的任意字符。 | | a{1, 3} 匹配“candy”中的a和“caandy”中的'aa'和“caaaandy”中的前面'aaa',但不匹配“cndy”中的任意字符。 | ||
|} | |||
===定位=== | |||
{| class="wikitable" | |||
! 特殊字符 | |||
! 含义 | |||
! 示例 | |||
|- | |- | ||
| [xyz] | | ^ | ||
| | | 匹配输入的开始。如果多行标志被设置为 true,那么也匹配换行符后紧跟的位置。在下面的特殊字符[^xyz]表示不包含方括号中的字符。 | ||
| ^A 匹配 "An E" 中的 'A',但不会匹配 "an A" 中的 'A'。 | |||
|- | |- | ||
| | | $ | ||
| | | 匹配输入的结束。如果多行标志被设置为 true,那么也匹配换行符前的位置。 | ||
| | | t$ 匹配 "eat" 中的 't',但不匹配 "eater" 中的 't'。 | ||
|- | |- | ||
| \b | | \b | ||
第79行: | 第113行: | ||
| 匹配一个非单词边界。 | | 匹配一个非单词边界。 | ||
| \B..匹配"noonday"中的'oo',y\B..匹配"possibly yesterday"中的’yes‘。 | | \B..匹配"noonday"中的'oo',y\B..匹配"possibly yesterday"中的’yes‘。 | ||
| | |} | ||
===分组=== | |||
===字符转义=== | |||
{| class="wikitable" | |||
! 特殊字符 | |||
! 含义 | |||
! 示例 | |||
| | |||
|- | |- | ||
| \n | | \n | ||
第103行: | 第129行: | ||
| 匹配一个回车符 (U+000D)。 | | 匹配一个回车符 (U+000D)。 | ||
| | | | ||
|- | |- | ||
| \t | | \t | ||
第120行: | 第138行: | ||
| | | | ||
|- | |- | ||
| \ | | \b | ||
| | | 匹配一个退格(U+0008)。 | ||
| \ | | | ||
|- | |||
| \f | |||
| 匹配一个换页符 (U+000C)。 | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
|} | |||
===其他=== | |||
{| class="wikitable" | |||
! 特殊字符 | |||
! 含义 | |||
! 示例 | |||
|- | |||
| \ | |||
| 转义特殊字符,或和其他字符构成特殊字符。 | |||
| \\ 匹配 \ ,\d 匹配数字 | |||
|- | |- | ||
| \ | | \cX | ||
| | | 匹配字符串中的一个控制符,当X是处于A到Z之间的字符的时候。 | ||
| \ | | \cM匹配字符串中的 control-M (U+000D)。 | ||
|- | |- | ||
| (x) | | (x) | ||
第156行: | 第196行: | ||
{{了解更多 | {{了解更多 | ||
|[https://docs.python.org/zh-cn/3/library/re.html Python 文档:re] | |[https://docs.python.org/zh-cn/3/library/re.html Python 文档:re] | ||
|[https://docs.python.org/zh-cn/3/howto/regex.html Python 文档:正则表达式HOWTO] | |||
|[https://docs.python.org/zh-cn/3/library/re.html#re.compile Python 文档:re函数/re.compile() ] | |[https://docs.python.org/zh-cn/3/library/re.html#re.compile Python 文档:re函数/re.compile() ] | ||
}} | }} | ||
第179行: | 第220行: | ||
| re.findall() | | re.findall() | ||
| 查找所有匹配的字符串,返回匹配的字符串列表或字符串元组列表。 | | 查找所有匹配的字符串,返回匹配的字符串列表或字符串元组列表。 | ||
| | |||
|- | |||
| re.finditer() | |||
| | |||
| | | | ||
|- | |- | ||
第184行: | 第229行: | ||
| 用正则表达式分割。 | | 用正则表达式分割。 | ||
|<code>re.split(r'\W+', 'Words, words, words.')</code>返回<nowiki>['Words', 'words', 'words', '']</nowiki> | |<code>re.split(r'\W+', 'Words, words, words.')</code>返回<nowiki>['Words', 'words', 'words', '']</nowiki> | ||
|- | |- | ||
|re.sub() | |re.sub() | ||
第204行: | 第245行: | ||
{{了解更多 | {{了解更多 | ||
|[https://docs.python.org/zh-cn/3/library/re.html#functions Python文档:re函数] | |[https://docs.python.org/zh-cn/3/library/re.html#functions Python文档:re函数] | ||
|[https://docs.python.org/zh-cn/3/howto/regex.html#performing-matches Python文档:正则表达式HOWTO/应用匹配] | |||
}} | }} | ||
===re模块的匹配对象=== | ===re模块的匹配对象=== | ||
search()、match()、fullmatch() | search()、match()、fullmatch()等函数如果匹配到结果就会返回一个匹配对象,否则返回None。以下示例中的m也是表中示例m: | ||
<syntaxhighlight lang="python" > | |||
import re | |||
m = re.search('\d+', '电话:123') | |||
print(m.group()) # 123 | |||
print(m.span()) # (3, 6) | |||
</syntaxhighlight> | |||
{| class="wikitable" | {| class="wikitable" | ||
! 名称 | ! 名称 | ||
第214行: | 第264行: | ||
|- | |- | ||
| group() | | group() | ||
| | | 返回正则匹配的字符串 | ||
| | | | ||
|- | |- | ||
| groups() | | groups() | ||
| | | | ||
| | | | ||
|- | |- | ||
| start() | | start() | ||
| | | 返回匹配的开始位置 | ||
| | | | ||
|- | |- | ||
| end() | | end() | ||
| 返回匹配的结束位置 | |||
| | | | ||
|- | |||
| span() | |||
| 返回包含匹配 (start, end) 位置的元组 | |||
| | | | ||
|- | |- | ||
第246行: | 第296行: | ||
==资源== | ==资源== | ||
=== | ===语言或平台官网=== | ||
* | * PCRE官网:https://www.pcre.org/ | ||
* | * Python 标准库 re:https://docs.python.org/zh-cn/3/library/re.html | ||
* | * .NET 正则表达式:https://learn.microsoft.com/zh-cn/dotnet/standard/base-types/regular-expressions | ||
===相关网站=== | ===相关网站=== | ||
* [https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions MDN文档:JavaScript - 正则表达式] | |||
* [https://learn.microsoft.com/zh-cn/dotnet/standard/base-types/regular-expression-language-quick-reference .Net文档:正则表达式语言 - 快速参考] | |||
* [https://deerchao.cn/tutorials/regex/regex.htm deerchao.cn:正则表达式30分钟入门教程] | * [https://deerchao.cn/tutorials/regex/regex.htm deerchao.cn:正则表达式30分钟入门教程] | ||
* [https://zh.wikipedia.org/wiki/正则表达式 维基百科:正则表达式] | * [https://zh.wikipedia.org/wiki/正则表达式 维基百科:正则表达式] | ||
* [https:// | * [https://perldoc.perl.org/perlre.html Perl 文档] | ||
[[分类:数据分析]] | [[分类:数据分析]] |
2022年12月22日 (四) 15:40的最新版本
正则表达式(Regular Expression),简写regex、regexp或RE。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。通常被用来检索、替换那些符合某个模式(规则)的文本。
简介
时间轴
基本语法
一个正则表达式通常被称为一个模式(pattern),为用来描述或者匹配一系列符合某个句法规则的字符串。如this, that都可以由th(is|at)
这个模式来描述。
正则表达式由普通字符,比如:abc;或者是简单字符和特殊字符的组合,比如ab\*c。
元字符
特殊字符是由元字符或元字符和普通字符构成,比如\d表示匹配一个数字。元字符是有特殊意义的字符,它们被作为一般的字符使用时,必须要通过“转义”(前面加一个反斜杠“\”)来去除他们本身的特殊意义,这14个元字符如下:
. ^ $ * + ? { } [ ] \ | ( )
字符类
特殊字符 | 含义 | 示例 |
---|---|---|
. | 默认匹配除换行符之外的任何单个字符。如果指定了参数DOTALL ,它将匹配包括换行符的任意字符。 | .n 匹配 "nay, an apple is on the tree" 中的 'an' 和 'on'. |
\d | 匹配一个数字。等价于[0-9]。 | \d 匹配"B2 is the suite number."中的'2'。 |
\D | 匹配一个非数字字符。等价于[^0-9]。 | \D 匹配"B2 is the suite number."中的'B' 。 |
\w | 匹配一个单字字符(字母、数字或者下划线)。等价于 [A-Za-z0-9_]。 | \w 匹配 "apple," 中的 'a'和 |
\W | 匹配一个非单字字符。等价于 [^A-Za-z0-9_]。 | \W匹配 "50%." 中的 '%'。"$5.28,"中的 '5'。 |
\s | 匹配一个空白字符,包括空格、制表符、换页符和换行符。 | \s\w*匹配"foo bar."中的' bar'。 |
\S | 匹配一个非空白字符。 | \S\w* 匹配"foo bar."中的'foo' |
[字符集] | 匹配方括号中的任意一个字符。特殊符号"\ * . "在字符集没有特殊意义。可以使用破折号(-)来指定一个字符范围。 | [abcd] 和[a-d]是一样的,可以匹配"brisket"中的‘b’和“city”中的‘c’。 |
[^字符集] | 反向字符集,匹配任何没有包含在方括号中的字符。可以使用破折号(-)来指定一个字符范围。任何普通字符在这里都是起作用的。 | [^abc] 和 [^a-c] 是一样的。可以匹配"brisket"中的‘r’和匹配“chop”中的‘h’。 |
数量词
特殊字符 | 含义 | 示例 |
---|---|---|
* | 匹配前一个表达式 0 次或多次。等价于 {0,}。 | bo* 匹配 "A ghost boooooed" 中的 'booooo' 和 "A bird warbled" 中的 'b' |
+ | 匹配前面一个表达式 1 次或者多次。等价于 {1,}。 | a+ 匹配 "candy" 中的 'a' 和 "caaaaaaandy" 中的 'aaaaaaa'。 |
? | 匹配前面一个表达式 0 次或者 1 次。等价于 {0,1}。还用于先行断言中,如本表的 x(?=y) 和 x(?!y) 条目所述。 | e?le? 匹配 "angel" 中的 'el'、"angle" 中的 'le' 以及 "oslo' 中的 'l'。 |
{n} | n 是一个非负整数,匹配前一个字符刚好出现了n次。 | a{2}匹配“caandy”中的'aa'和“caaaandy”中的前面的'aa',但不匹配“candy”中的'a' |
{n,} | n 是一个非负整数,匹配前一个字符至少出现了n次。 | a{2,}匹配“caandy”中的'aa'和“caaaandy”中的'aaaa',但不匹配“candy”中的'a' |
{n,m} | m 和 n 均为非负整数,匹配前面的字符至少n次,最多m次。如果 n 或者 m 的值是0, 这个值被忽略。 | a{1, 3} 匹配“candy”中的a和“caandy”中的'aa'和“caaaandy”中的前面'aaa',但不匹配“cndy”中的任意字符。 |
定位
特殊字符 | 含义 | 示例 |
---|---|---|
^ | 匹配输入的开始。如果多行标志被设置为 true,那么也匹配换行符后紧跟的位置。在下面的特殊字符[^xyz]表示不包含方括号中的字符。 | ^A 匹配 "An E" 中的 'A',但不会匹配 "an A" 中的 'A'。 |
$ | 匹配输入的结束。如果多行标志被设置为 true,那么也匹配换行符前的位置。 | t$ 匹配 "eat" 中的 't',但不匹配 "eater" 中的 't'。 |
\b | 匹配一个词的边界。 | \bm 匹配“moon”中的‘m’,但oo\b 不能匹配"moon"中的'oo',而 oon\b/匹配"moon"中的'oon'。 |
\B | 匹配一个非单词边界。 | \B..匹配"noonday"中的'oo',y\B..匹配"possibly yesterday"中的’yes‘。 |
分组
字符转义
特殊字符 | 含义 | 示例 |
---|---|---|
\n | 匹配一个换行符 (U+000A)。 | |
\r | 匹配一个回车符 (U+000D)。 | |
\t | 匹配一个水平制表符 (U+0009)。 | |
\v | 匹配一个垂直制表符 (U+000B)。 | |
\b | 匹配一个退格(U+0008)。 | |
\f | 匹配一个换页符 (U+000C)。 | |
其他
特殊字符 | 含义 | 示例 |
---|---|---|
\ | 转义特殊字符,或和其他字符构成特殊字符。 | \\ 匹配 \ ,\d 匹配数字 |
\cX | 匹配字符串中的一个控制符,当X是处于A到Z之间的字符的时候。 | \cM匹配字符串中的 control-M (U+000D)。 |
(x) | 分组,能够重复使用x表达式和提取该组匹配值。重复引用通过\n(数字)。改组的值在正则表达式的替换环节可以通过$n(数字)来获取。注意组值为第一次匹配值 | (f.o) \1 匹配'bar fao fao bar'中的'fao fao',python中值 |
(?:x) |
Python中使用
re模块
re模块提供两种使用方式,两种方式效果一样:一种是直接调用re模块的函数,一般使用这种方式。另一种是先调用re.compile()
生成正则对象,再通过对象调用方法,这种适用于一个正则表达式需要多次使用,因为会编译缓存所以速度更快。以match函数示例:
# 直接使用
result = re.match(pattern, string)
# 编译后使用
prog = re.compile(pattern)
result = prog.match(string)
re模块的函数
名称 | 描述 | 示例 |
---|---|---|
re.search() | 搜索整个字符串,返回一个成功的匹配 | re.match('e','hello') 返回一个匹配对象,第二个字母e
|
re.match() | 从起始位置开始搜索,返回从起始位置开始都成功的匹配。 | re.match('h','hello') 返回一个匹配对象,第一个h。 re.match('e','hello') 返回None
|
re.fullmatch() | 需要整个字符串都匹配,返回一个成功的匹配。3.4 新版功能。 | |
re.findall() | 查找所有匹配的字符串,返回匹配的字符串列表或字符串元组列表。 | |
re.finditer() | ||
re.split() | 用正则表达式分割。 | re.split(r'\W+', 'Words, words, words.') 返回['Words', 'words', 'words', '']
|
re.sub() | 用正则表达式替换 | |
re.subn() | ||
re.escape() |
re模块的匹配对象
search()、match()、fullmatch()等函数如果匹配到结果就会返回一个匹配对象,否则返回None。以下示例中的m也是表中示例m:
import re
m = re.search('\d+', '电话:123')
print(m.group()) # 123
print(m.span()) # (3, 6)
名称 | 描述 | 示例 |
---|---|---|
group() | 返回正则匹配的字符串 | |
groups() | ||
start() | 返回匹配的开始位置 | |
end() | 返回匹配的结束位置 | |
span() | 返回包含匹配 (start, end) 位置的元组 | |
了解更多 >> Python文档:re/匹配对象
资源
语言或平台官网
- PCRE官网:https://www.pcre.org/
- Python 标准库 re:https://docs.python.org/zh-cn/3/library/re.html
- .NET 正则表达式:https://learn.microsoft.com/zh-cn/dotnet/standard/base-types/regular-expressions