about
关于正则表达式
正则表达式(Regular Expression,简写regex、re),又称之为正则表示式、正则表示法、规则表达式等,它是计算机科学的一个概念。
正则表达式可以通过特殊字符+普通字符来实现一组规则,用于匹配字符串中符合规则的字串,从而达到将匹配的字串取值、替换的目的。
许多的程序设计语言都开发出自己的正则表达式引擎以支持利用正则表达式进行字符串操作。
如何学好正则表达式
无他,唯手熟尔。
对于新手来说,这里推荐几个在线的正则匹配网站,来帮助你快速编写正则规则:
基础的元字符
元字符是具有特殊含义的字符:
字符 | 描述 | 示例 |
---|---|---|
[] | 一组字符 | "[a-m]" |
\ | 表示特殊序列(也可用于转义特殊字符) | "\d" |
. | 换行符除外的任何字符 | "he..o" |
^ | 起始于 | "^hello" |
$ | 结束于 | "world$" |
* | 零次或多次出现 | "aix*" |
+ | 一次或多次出现 | "aix+" |
{} | 确切地指定的出现次数 | "al{2}" |
| | 两者任一 | "falls|stays" |
() | 捕获和分组 |
后续的字符集和特殊序列、量词都是在这些基础的元字符上展开的细节描述。
特殊序列
特殊序列指的是 \
后跟下表中的某个字符,拥有特殊含义:
字符 | 描述 | 备注 |
---|---|---|
\A | 如果指定的字符位于字符串的开头,则返回匹配项 | 只在Python中测试可用 |
\b | 返回指定字符位于单词的开头或末尾的匹配项 | |
\B | 返回指定字符存在的匹配项,但不在单词的开头(或结尾处) | 在Python和JavaScript中稍有不同 |
\d | 返回字符串包含数字的匹配项(数字 0-9) | |
\D | 返回字符串不包含数字的匹配项 | |
\s | 返回字符串包含空白字符的匹配项 | |
\S | 返回字符串不包含空白字符的匹配项 | |
\w | 返回一个匹配项,其中字符串包含任何单词字符 (从 a 到 Z 的字符,从 0 到 9 的数字和下划线 _ 字符) | |
\W | 返回一个匹配项,其中字符串不包含任何单词字符 | |
\Z | 如果指定的字符位于字符串的末尾,则返回匹配项 |
\A
import re
print(re.findall('\AThe', 'The rain in Spain')) # ['The']
注意,我只在Python中使用返回了正确的结果。在在线正则表达式测试网站上测试无效,经查,在线正则表达式测试网站基于JavaScript来做的正则匹配,而JavaScript中不支持\A
。
\b
# 规则:
kai\b
# 待匹配字符串:
zhangkai kaizhang
# 匹配到 1 条结果:
kai # 匹配的是 zhangkai 的 kai
匹配以kai
结尾的单词,也可以匹配以kai
开头的单词:
# 规则:
\bkai
# 待匹配字符串:
zhangkai kaizhang
# 匹配到 1 条结果:
kai # 匹配的是 kaizhang 的 kai
用的不多。
\B
先来看在JavaScript中:
# 规则:
\Bain
# 待匹配字符串:
The rain in Spain ainxxx ooainxxx
# 匹配到 3 条结果:
ain # rain 中的 ain
ain # Spain 中的 ain
ain # ooainxxx 中的 ain
如果\B
在前面,匹配非ain
开头的单词,但允许ain
在单词的中间和结尾。
# 规则:
ain\B
# 待匹配字符串:
The rain in Spain ainxxx ooainxxx
# 匹配到 2 条结果:
ain # ainxxx 中的 ain
ain # ooainxxx 中的 ain
如果\B
在后面,匹配非ain
结尾的单词,但允许ain
在单词的中间和开头。
在Python中:
import re
# 如果 \B 在前面,匹配非 ain 开头的单词,但允许以 ain 结尾
print(re.findall('\Bain', 'The rain in Spain ainxxx')) # ['ain', 'ain']
# 如果 \B 在后面,匹配非 ain 结尾的单词,但允许 ain 在单词的开头和中间
print(re.findall('ain\B', 'The rain in Spain')) # []
print(re.findall('ain\B', 'The rain in Spain ainxxx')) # ['ain']
print(re.findall('ain\B', 'The rain in Spain ainxxx ooainxxx')) # ['ain', 'ain']
\d
# 规则:
\d
# 待匹配字符串:
zhangkai123kaizhang456
# 匹配到 6 条结果:
1
2
3
4
5
6
每次匹配一个数字项。
\D
# 规则:
\D
# 待匹配字符串:
zhangkai123kaizhang456
# 匹配到 16 条结果:
z
h
a
n
g
k
a
i
k
a
i
z
h
a
n
g
每次匹配一个非数字项。
\s
# 规则:
\s
# 待匹配字符串:
zhang kai
# 匹配到 1 条结果:
# 是的,匹配到了一个空格,zhang和kai中的空格
每次匹配一个空格。
\S
# 规则:
# 待匹配字符串:
# 匹配到 16 条结果:
字符集
字符集,也称之为集合或方括号,是一对方括号 [] 内的一组字符,具有特殊含义:
集合 | 描述 |
---|---|
[arn] | 返回一个匹配项,其中存在指定字符(a,r 或 n)之一 |
[a-n] | 返回字母顺序 a 和 n 之间的任意小写字符匹配项 |
[^arn] | 返回除 a、r 和 n 之外的任意字符的匹配项 |
[0123] | 返回存在任何指定数字(0、1、2 或 3)的匹配项 |
[0-9] | 返回 0 与 9 之间任意数字的匹配 |
[a-zA-Z] | 返回字母顺序 a 和 z 之间的任何字符的匹配,小写或大写 |
[+] | 在集合中,+、*、.、|、()、$、{} 没有特殊含义,因此 [+] 表示:返回字符串中任何 + 字符的匹配项 |
[arn]
# 规则:
[arn]
# 待匹配字符串:
zhangkai
# 匹配到 3 条结果:
a
n
a
# 其他规则形式:
[123]
[0123456789]
[ABC]
[\d]
因为[]
每次只返回一个匹配项,所以有三个匹配结果。
[a-n]
# 规则:
[a-n]
# 待匹配字符串:
zhangkai
# 匹配到 7 条结果:
h
a
n
g
k
a
i
# 其他规则形式:
[0-9]
[a-z]
[A-Z]
[a-zA-Z0-9] 可以匹配所有大小写英文字符和数字
每次匹配的范围是a-n
之间的任意小写英文字母。
[^arn]
# 规则:
[^arn]
# 待匹配字符串:
^zhangkai
# 匹配到 6 条结果:
^
z
h
g
k
i
每次匹配非a
、r
、n
之外的任意字符,包括^
。
+ * . | () $ {}
# 规则:
[+*.|()${}a]
# 待匹配字符串:
a+bc*de.f|g(h)ig$kl{m}n
# 匹配到 10 条结果:
a
+
*
.
|
(
)
$
{
}
注意,上面列举的这些特殊字符,在[]
中使用的话,就是一个普通的字符。
# 规则:
# 待匹配字符串:
# 匹配到 3 条结果:
# 规则:
[arn]
# 待匹配字符串:
zhangkai
# 匹配到 3 条结果:
# 规则:
[arn]
# 待匹配字符串:
zhangkai
# 匹配到 3 条结果:
量词
量词约束字符或者字符组的重复规则。
符号 | 描述 | 备注 |
---|---|---|
* | 重复零次或多次 | |
+ | 重复一次或者多次 | |
? | 重复零次或者一次 | |
{n} | 重复n次 | |
{n,} | 重复n次或者多次 | 没有{,n} 的用法 |
{n,m} | 重复n到m次 |
that's all, see also:
维基百科:正则表达式 | 正则表达式 |