
11. python正则表达式
发布日期:2021-05-17 07:48:57
浏览次数:24
分类:精选文章
本文共 2956 字,大约阅读时间需要 9 分钟。
正则表达式语法
1.1 普通字符
[]
:表示一个字符组,代表匹配一位字符。[0-9]
:匹配0-9的数字字符。[a-zA-Z]
:匹配英文字母。[0-9][0-9]
:匹配长度为2的数字字符串。[Yy]es
:匹配Yes
或yes
。
1.2 字符转义
- 对于
-[]
等元字符,需要在正则表达式中进行转义。 [0\-9]
:匹配0、-、9三个字符。
1.3 元字符
\
:转义。^
:匹配输入的开头部分。$
:匹配输入的结尾部分。*
:表示0次或多次匹配。+
:表示1次或多次匹配。?
:表示0次或1次匹配。.
:匹配任意单个字符(不包括换行符)。(pattern)
:匹配模式并记住匹配项。|
:表示或。{n}
:精确匹配n次。{n,}
:表示至少匹配n次。[abc]
:匹配字符集abc。[^abc]
:匹配不在字符集abc中的字符。[a-z]
:匹配字符范围a到z。[^a-z]
:匹配不在字符范围a到z中的字符。\A
:匹配字符串的开头。\b
:匹配单词边界。\B
:匹配非单词边界。\d
:匹配数字字符。\D
:匹配非数字字符。\f
:匹配换页符。\n
:匹配换行符。\r
:匹配回车符。\s
:匹配任意空白字符。\S
:匹配任意非空白字符。\t
:匹配制表符。\v
:匹配垂直制表符。\w
:匹配任何单词字符(包括下划线)。\W
:匹配任何非单词字符。\z
:匹配字符串的结尾。\Z
:匹配字符串结尾或结尾之前的换行符。
1.4 贪婪与非贪婪模式
- 贪婪模式:限定符尽可能多地匹配字符串。
- 非贪婪模式:限定符尽可能少地匹配字符串,限定符后加
?
表示非贪婪模式。
1.5 零宽断言
(?=...)
:断言自身出现的位置后面可以匹配后面的表达式。(?<=...)
:断言自身出现的位置前面可以匹配后面的表达式。(?!)
:断言自身出现的位置后面不可以匹配后面的表达式。(?<!...)
:断言自身出现的位置前面不可以匹配后面的表达式。
re模块
2.1 re模式介绍
re
模块中str
和bytes
不能混合使用。- 由于正则表达式中的
\
和Python中的\
存在冲突,定义正则表达式时可以在字符串前面添加r
前缀。
2.2 compile函数
compile
函数用于编译正则表达式,生成一个Pattern
对象。- 示例:
import repattern = re.compile(r'\w+')
2.3 match函数
match
方法用于查找字符串指定位置的正则匹配,仅匹配一次。- 示例:
pattern = re.compile(r'\d+')m1 = pattern.match('one123') # 匹配位置从3-5,包含头不包含尾m2 = pattern.match('one123', 3, 5) # 匹配位置从3-5m3 = re.match(r'\d+','one123') # 不使用忽略大小写模式m4 = re.match(r'[a-z]+','Abcde', re.I) # 使用忽略大小写模式
2.4 search函数
search
方法用于查找字符串中指定位置的正则匹配,仅匹配一次。- 示例:
pattern = re.compile(r'\d+')m1 = pattern.search('one123') # 匹配位置从3-5,包含头不包含尾m2 = pattern.search('one123', 3, 5) # 匹配位置从3-5m3 = re.search(r'\d+','one123') # 不使用忽略大小写模式m4 = re.search(r'[a-z]+','Abcde', re.I) # 使用忽略大小写模式
2.5 findall函数
findall
函数用于查找所有匹配项。- 示例:
pattern = re.compile(r"\d{2}")m1 = pattern.findall("one1234") # 返回匹配结果列表m2 = pattern.findall("one1234", 0, 4) # 返回匹配结果列表m3 = re.findall(r"\d+","one1234") # 返回匹配结果列表m4 = re.findall(r"[a-z]","123Abcd", re.I) # 返回匹配结果列表
2.6 split函数
split
函数用于将字符串按正则表达式分割。- 示例:
pattern = re.compile(r"[\s\,\;]+")m1 = pattern.split("a,b;;c d") # 分割结果m2 = re.split(r"[\s\,\;]+","a,b;;c d") # 自动分割
2.7 sub函数
sub
函数用于使用正则表达式替换字符串。- 示例:
s = "hello 123 world 456"pattern = re.compile(r"(\w+)(\w+)")m1 = pattern.sub("hello world", s) # 替换一次m2 = pattern.sub("hello world", s, 1) # 替换一次m3 = re.sub(r"(\w+)(\w+)","hello world", s, 1) # 替换一次
re模块的分组匹配
- 分组是通过
()
扩起来的正则表达式,匹配出的内容表示一个分组。 - 分组后,通过
group(n)
和groups()
即可获取某个分组的内容。 - 示例:
pattern = re.compile("\d-\d-\d")m1 = pattern.match("1-2-3") # 不分组m2 = pattern.compile("(\d)-(\d)-(\d)") # 分组
常见正则表达式
6.1 邮箱地址
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
6.2 URL
^(https?:W)?([\da-z.-]+)\.([a-z.]{2,6})([V\w.-])V?$
6.3 匹配首尾空白字符的正则表达式
^\s|\s$
6.4 手机号码
^(13[0-9]|14[0-9]|15[0-9]|166|17[0-9]|18[0-9]|19[8|9])\d{8}$
6.5 电话号码
^(\d{3,4}-)?\d{7,8}$
6.6 18位身份证号码
^((\d{18}|([0-9x]{18})|(0-9X){18}))$
6.7 账号是否合法
^[a-zA-Z][a-zA-Z0-9_]{4,15}$
6.8 一年的月份
^(0?[1-9]|1[0-2])$
6.9 日期格式
^\d{4}-\d{1,2}-\d{1,2}$
6.10 一个月的天数
^((0?[1-9])|((1|2)[0-9])|30|31)$
6.11 IP地址
^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$