python re.match正则表达式

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

re.match 函数语法:

re.match(pattern, string, flags=0)

re.match 函数参数说明:

参数 描述
pattern 匹配的正则表达式
string 要匹配的字符串
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

匹配成功re.match方法返回一个匹配的对象,否则返回None。 我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

匹配对象方法 描述
group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号

re.match 目录

1. re.match 如何使用

2. re模块示例(匹配以xinbiancheng开头的语句)

3.re.match 正表达式匹配单个字符

4. re.match 正则表达式匹配多个字符

5. re.match 正则表达式练习

6.re.match 正则表达式-修饰符

re.match 如何使用

# coding=utf-8
# 导入正则表达式需要的re模块
import re

# 使用match方法进行匹配操作
result = re.match('正则表达式', '要匹配的字符串','修饰符')

# 如果上一步匹配到数据的话,可以使用group方法来提取数据
result.group()

re模块示例(匹配以xinbiancheng开头的语句)

# coding=utf-8
import re
result = re.match("xinbiancheng", "xinbiancheng.cn")
# match 第一个参数是需要匹配的字符串,第二个是源字符串
print(result.group())

通过 print(result.group()) 打印的结果为 xinbiancheng

re 常见匹配模式

需要了解正则表达式的元字符,常见的元字符如下表,更多更详细的 正则表达式 - 元字符 请点击此链接

模式 描述
\w 匹配字母数字及下划线
\W 匹配非字母数字下划线
\s 匹配任意空白字符,等价于 [\t\n\r\f].
\S 匹配任意非空字符
\d 匹配任意数字,等价于 [0-9]
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
\z 匹配字符串结束
\G 匹配最后匹配完成的位置
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串的开头
$ 匹配字符串的末尾。
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
* 匹配0个或多个的表达式。
+ 匹配1个或多个的表达式。
? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
{n} 精确匹配n个前面表达式。
{n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a|b 匹配a或b
( ) 匹配括号内的表达式,也表示一个组

re.match 匹配单个字符

实例1说明,下面的正则表示会用到.小数点这个符号,代表的是:匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。

#coding=utf-8
import re  # 导入python正则表达式的re模块
ret = re.match(".", "one")
print(ret.group())
#正则表达式输出结果  o

ret = re.match("t.o", "two")
print(ret.group())
#正则表达式输出结果 two

ret = re.match("t.", "three")
print(ret.group())
#正则表达式输出结果 th

ret = re.match("h.", "three")
print(ret.group())
#最后一个会报错,因为match必须从第一个开始就必须匹配,three的第一个字母是t,而正则表达式是"h."将不匹配
'''
Traceback (most recent call last):
  File "D:/pythoncode/输入部分/正则.py", line 31, in <module>
    print(ret.group())
AttributeError: 'NoneType' object has no attribute 'group'
'''

实例2:

[]的正则表达式的用法

例如[abc]表示字符“a”或“b”或“c”,更多更详细请点击 正则表达式 [] 字符组(Character Classes)

# coding=utf-8
import re
# 大小写h都可以的情况
ret = re.match("[hH]", "hello Python")
print(ret.group())  # h

ret = re.match("[hH]", "Hello Python")
print(ret.group())  # H

ret = re.match("[hH]ello Python", "Hello Python")
print(ret.group())
# Hello Python

实例3:

期望匹配0,1,2,3,4,5,6,7,8,9 如何使用[]的正则表达式,实现呢?

#coding=utf-8
import re  # 导入python正则表达式的re模块
# 匹配0到9第一种写法
ret = re.match("[0123456789]Hello Python","6Hello Python")
print(ret.group())
# 6Hello Python

实例4:

 期望匹配0,1,2,3,4,5,6,7,8,9 使用[0123456789]这种方法比较麻烦,有没有使用区间的方法去解决这种方案的正则表达式呢?

当然有 [0123456789] 简写 为 [0-9] 代码如下:

# coding=utf-8
# 导入正则表达式需要的re模块
import re
# 匹配0到9第二种写法
ret = re.match("[0-9]Hello Python", "6Hello Python")
print(ret.group())
# 6Hello Python

ret = re.match("[0-34-9]Hello Python", "6Hello Python")
# 正则表达式定义了两个区间 0-3 和 4-9 中间可以用,号分隔
print(ret.group())
# 6Hello Python

实例5:

# coding=utf-8
# 导入正则表达式需要的re模块
import re
# 下面这个正则不能够匹配到数字4,因此ret为None
ret = re.match("[0-35-9]Hello Python", "4Hello Python")
print(ret.group())  # 报错信息如下:
'''
Traceback (most recent call last):
  File "D:/pythoncode/输入部分/正则.py", line 29, in <module>
    print(ret.group())
AttributeError: 'NoneType' object has no attribute 'group'
'''

经过测试,我们发现区间少了一个"4",所以匹配不成功。

是否有更好的方法表示数字呢?

\d 的正则表达式的用法

\d 等价于  [0-9]

实例6:

# coding=utf-8
# 导入正则表达式需要的re模块
import re
# 使用\d进行 正则表达式 匹配
ret = re.match("\dHello Python", "4Hello Python")
print(ret.group())
# 4Hello Python

# 使用\d进行 正则表达式 匹配
ret = re.match("元旦是\d月\d日","元旦是1月1日")
print(ret.group())
# 元旦是1月1日

re.match 正则表达式匹配多个字符

正则表达式-重复匹配

在正则表达式语法中,定义了一组重复类量词,如表所示。它们定义了重复匹配字符的数量。

重复类量词列表
量词 描述
n+ 匹配任何包含至少一个 n 的字符串
n* 匹配任何包含零个或多个 n 的字符串
n? 匹配任何包含零个或一个 n 的字符串
n{x} 匹配包含 x 个 n 的序列的字符串
n{x,y} 匹配包含最少 x 个、最多 y 个 n 的序列的字符串
n{x,} 匹配包含至少 x 个 n 的序列的字符串

实例7:*星号量词的正则表达式的用法

# coding=utf-8
# 导入正则表达式需要的re模块
import re
ret = re.match("[A-Z][a-z]*","A")
print(ret.group())
# A

ret = re.match("[A-Z][a-z]*","AbcD")
print(ret.group())
# Abc

ret = re.match("[A-Z][a-z]*","Abcdef")
print(ret.group())
# Abcdef

实例8:+加号量词的正则表达式的用法

需求:匹配出,变量名是否有效
备注:
(1)变量名只能是 字母、数字或下划线的任意组合
(2)变量名的第一个字符不能是数字
(3)关键字不能声明为变量名,例如if / lambda/ python/ else /class /global/ 等等

# coding=utf-8
# 导入正则表达式需要的re模块
import re
# 定义变量名称列表
names = ["name1", "_name", "2_name", "__name__", "class"]
# 定义关键字名称列表
keywords = ["if", "class", "lambda", "python", "else", "class", "global"]
for name in names:
    ret = re.match("[a-zA-Z_]+[\w]*",name) #\w 匹配字母数字及下划线
    if ret:
        if name not in keywords:
            print("变量名 %s 符合要求" % ret.group())
        else:
            print("变量名 %s 是关键字" % ret.group())
    else:
        print("变量名 %s 非法" % name)

# 运行结果:
# 变量名 name1 符合要求
# 变量名 _name 符合要求
# 变量名 2_name 非法
# 变量名 __name__ 符合要求
# 变量名 class 是关键字

实例9:?问号量词的正则表达式的用法

需求:匹配出,0到99之间的数字

# coding=utf-8
# 导入正则表达式需要的re模块
import re
ret = re.match("[1-9]?\d$","6")
print(ret.group())
# 6

ret = re.match("[1-9]?\d$","66")
print(ret.group())
# 66

ret = re.match("[1-9]?\d$","0")
print(ret.group())
# 0

ret = re.match("[1-9]?\d$","06")
print(ret.group()) #因06是两位数字,而正则表达式[1-9]代表的是第一位数字所以不能匹配0
# 报错信息如下
'''
Traceback (most recent call last):
  File "D:/pythoncode/输入部分/正则.py", line 37, in <module>
    print(ret.group())
AttributeError: 'NoneType' object has no attribute 'group'
'''

实例10:{}花括号量词的正则表达式的用法

需求:匹配出,8到20位的密码,可以是大小写英文字母、数字、下划线

# coding=utf-8
# 导入正则表达式需要的re模块
import re
ret = re.match("[a-zA-Z0-9_]{6}","ladfja123")  # 正则表达式匹配6位
print(ret.group())
# ladfja

ret = re.match("[a-zA-Z0-9_]{8,20}","abcdefghijklmnopqrstuvwxyz")  # 正则表达式匹配8-20位
print(ret.group())
# abcdefghijklmnopqrst

正则表达式练习

题目1:匹配出163的邮箱地址,且@符号之前有4到20位,例如hello@163.com,下面的代码正确吗?

# coding=utf-8
# 导入正则表达式需要的re模块
import re
E_mail = "hello_world@1633com"
ret = re.match("\w{4,20}@163.com", E_mail)
print(ret.group())
# hello_world@1633com

分析上面代码,\w 代表的是匹配字母数字及下划线,\w{4,20} 表示的是可以匹配字母数字及下划线4-20位,然后在加上@163.com,从理论上是可以匹配出任何163的邮箱地址,

为什么@1633com也匹配出来了呢?在正则表达式中,.小数点表示任意一个字符,所以不是.小数点也就匹配出来了,如果想匹配出163的邮箱地址,需要了解正则表达式-转义

正确代码如下:

# coding=utf-8
# 导入正则表达式需要的re模块
import re
E_mail = "hello_world@163.com"
ret = re.match("\w{4,20}@163\.com", E_mail)
print(ret.group())
# hello_world@163.com

E_mail = "hello_world@1633com"
ret = re.match("\w{4,20}@163\.com", E_mail)
if ret is None:
    print("正则表达式不匹配")
else:
    print(ret.group())
# 正则表达式不匹配

正则表达式 - 修饰符

标记也称为修饰符,正则表达式的标记用于指定额外的匹配策略。

re.match 第3个参数,flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等,也叫 正则表达式 - 修饰符

正则表达式修饰符 - 可选标志

修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解
# coding=utf-8
# 导入正则表达式需要的re模块
import re
ret = re.match("a","A", re.I)
print(ret.group())
# re.I 增加了大小写不敏感的正则表达式修饰符,所以小写的a能匹配大写的A
# A

ret = re.match("a","a", re.I)
print(ret.group())
# a

ret = re.match("a","A")
# 没有设置 re.I 正则表达式修饰符,所以小写的a不能匹配大写的A
print(ret.group())
# 打印结果报错

从上面的例子中发现设置了re.I 正则表达式的修饰符 a字母大小写a或者A不敏感。

由于篇幅限制 re.match 将在下一节中继续,点击广告支持一下,接着再来。