about
Python3.6.8
关于正则表达式
正则表达式(Regular Expression,简写regex、re),又称之为正则表示式、正则表示法、规则表达式等,它是计算机科学的一个概念。
正则表达式可以通过特殊字符+普通字符来实现一组规则,用于匹配字符串中符合规则的字串,从而达到将匹配的字串取值、替换的目的。
许多的程序设计语言都开发出自己的正则表达式引擎以支持利用正则表达式进行字符串操作。
如何学好正则表达式
无他,唯手熟尔。
对于新手来说,这里推荐几个在线的正则匹配网站,来帮助你快速编写正则规则:
- 正则表达式在线测试 - 站长工具,我一般都是使用这个网站先将基本规则写出来,然后在放在Python代码中调试,注意在线的正则网站,一般都是基于JavaScript的正则规则来匹配结果,而Python中的正则和JavaScript的正则对于某些规则不太一致,所以,大家在调试时,需要注意。
- https://regexr.com/
- regexper.com
Python中的正则表达式
从Python角度来说,正则表达式本质上是内嵌在Python中的一种微小的、高度专业化的编程语言,通过内置模块re与其进行交互。
我们在Python中实现的正则表达式规则会被编译为字节码,然后由C编写的匹配引擎进行匹配。
Python中的re和regex
一般的,regex通常指Python的正则模块re,但是在2009年时,由Matthew Barnett开发了一个更强大的正则表达式引擎——regex模块,用于扩展re模块不支持的一些正则表达式中的高级特性,如固化分词(Atomic grouping)、可变长度的逆序环视(Variable-length lookbehind)、递归匹配(Recursive patterns)等特性。
目前regex模块以第三方库的形式存在,可以从pypi上下载,而且也在不断地进行版本迭代。
# https://pypi.org/project/regex/
# pip install regex
import regex as re
当然,re模块足以应付99.99%的使用场景了,所以,我们还是以re模块来展开学习。
后续的示例和解释都是从Python的角度出发的。且所有示例都是用Python来完成,所以,先学习一个re.sub
方法,这个方法将匹配到的值替换为指定文本,之所以先学习这个,就是让你一眼看到字符串中哪个位置的字符被匹配到了。
import re
# 用 "666" 替换 字符串 "zhang kai" 中的所有空白符 \s表示匹配空白符
print(re.sub('\s', '666', 'zhang kai')) # zhang666kai
需要牢记的
本小接摘自w3school的Python RegEx
元字符
元字符是具有特殊含义的字符:
字符 | 描述 |
---|---|
[] | 一组字符 |
\ | 示意特殊序列(也可用于转义特殊字符) |
. | 任何字符(换行符除外) |
^ | 起始于 |
$ | 结束于 |
* | 零次或多次出现 |
+ | 一次或多次出现 |
{} | 确切地指定的出现次数 |
| | 两者任一 |
() | 捕获和分组 |
特殊序列
特殊序列指的是 \ 后跟下表中的某个字符,拥有特殊含义:
字符 | 描述 |
---|---|
\A | 如果指定的字符位于字符串的开头,则返回匹配项 |
\b | 返回指定字符位于单词的开头或末尾的匹配项 |
\B | 返回指定字符存在的匹配项,但不在单词的开头(或结尾处) |
\d | 返回字符串包含数字的匹配项(数字 0-9) |
\D | 返回字符串不包含数字的匹配项 |
\s | 返回字符串包含空白字符的匹配项 |
\S | 返回字符串不包含空白字符的匹配项 |
\w | 返回一个匹配项,其中字符串包含任何单词字符 (从 a 到 Z 的字符,从 0 到 9 的数字和下划线 _ 字符) |
\W | 返回一个匹配项,其中字符串不包含任何单词字符 |
\Z | 如果指定的字符位于字符串的末尾,则返回匹配项 |
\A
import re
result = re.sub(r'\AThe', '666', 'The rain in Spain ainxxx ooainxxx The')
print(result) # 666 rain in Spain ainxxx ooainxxx The
如果要匹配的字符在整个字符串的开头,则匹配成功。
\b
import re
result = re.sub(r'\bain', '666', 'The rain in Spain ainxxx ooainxxx The')
print(result) # 666 rain in Spain ainxxx ooainxxx The
result = re.sub(r'ain\b', '666', 'The rain in Spain ainxxx ooainxxx The')
print(result) # 666 rain in Spain ainxxx ooainxxx The
集合(Set)
集合(Set)是一对方括号 [] 内的一组字符,具有特殊含义:
集合 | 描述 |
---|---|
[arn] | 返回一个匹配项,其中存在指定字符(a,r 或 n)之一 |
[a-n] | 返回字母顺序 a 和 n 之间的任意小写字符匹配项 |
[^arn] | 返回除 a、r 和 n 之外的任意字符的匹配项 |
[0123] | 返回存在任何指定数字(0、1、2 或 3)的匹配项 |
[0-9] | 返回 0 与 9 之间任意数字的匹配 |
[0-5][0-9] | 返回介于 0 到 9 之间的任何数字的匹配项 |
[a-zA-Z] | 返回字母顺序 a 和 z 之间的任何字符的匹配,小写或大写 |
[+] | 在集合中,+、*、.、|、()、$、{} 没有特殊含义,因此 [+] 表示:返回字符串中任何 + 字符的匹配项 |
re中的常用方法
下表列举了re中的常用方法:
常见示例
匹配
pattern = r'^[-+]?[0-9]*\.?[0-9]+$'
print(bool(re.match(pattern, 你的字符串)))
匹配手机号
import re
print(re.match(r'^1[3-9]\d{9}$', '18211101111'))
Django中的格式校验:
# django中的格式校验
from django.core import validators
validators.RegexValidator(r"^((0\d{2,3}-\d{7,8})|(1[3584]\d{9}))$", message="手机号格式错误")
邮箱
# ---------------------- 方式1 ----------------------
import re
from django.core import validators
class RegexValidator(object):
def __init__(self, rex):
self.rex = str(rex)
def __call__(self, value):
match_obj = re.match(self.rex, value)
if not match_obj: # 校验失败
raise validators.ValidationError("自定义校验类:email不合法[{}]".format(value))
return value
RegexValidator(r"^\w+@\w+\.\w+$")
that's all,see also: