摘要
- 在正则表达式中,如果直接给出字符,就是精确匹配。
{m,n}?
对于前一个字符重复m
到n
次,并且取尽可能少的情况 在字符串'aaaaaa'
中,a{2,4}
会匹配 4 个a
,但a{2,4}?
只匹配 2 个a
。
^
表示行的开头,^\d
表示必须以数字开头。
$
表示行的结束,\d$
表示必须以数字结束。
你可能注意到了,py
也可以匹配'python'
–>py
;
但是加上^py$
就变成了整行匹配,就只能匹配’py’了,匹配'python'
时,就什么也得不到。
参考表
正则表达式特殊序列
re模块
re.compile(pattern[, flags])
把正则表达式的模式和标识转化成正则表达式对象,供 match()
和 search()
这两个函数使用。
re 所定义的 flag 包括:
1 2 3 4 5 6 |
re.I 忽略大小写 re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境 re.M 多行模式 re.S 即为’ . ’并且包括换行符在内的任意字符(’ . ’不包括换行符) re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库 re.X 为了增加可读性,忽略空格和’ # ’后面的注释 |
以下两种用法结果相同:
(A)
1 2 |
compiled_pattern = re.compile(pattern) result = compiled_pattern.match(string) |
(B)
1 |
result = re.match(pattern, string) |
1 2 3 |
s = 'ABC\\-001' # Python的字符串 #对应的正则表达式字符串变成: #'ABC\-001' |
因此我们强烈建议使用Python的r前缀,就不用考虑转义的问题了
1 2 3 |
s = r'ABC\-001' # Python的字符串 # 对应的正则表达式字符串不变: # 'ABC\-001' |
search
re.search(pattern, string[, flags])
在字符串中查找匹配正则表达式模式的位置,返回 MatchObject
的实例,如果没有找到匹配的位置,则返回 None
。
对于已编译的正则表达式对象来说(re.RegexObject)
,有以下 search
的方法:
search (string[, pos[, endpos]])
若 regex
是已编译好的正则表达式对象,regex.search(string, 0, 50)
等同于 regex.search(string[:50], 0)
。
1 2 3 |
>>> pattern = re.compile("a") >>> pattern.search("abcde") # Match at index 0 >>> pattern.search("abcde", 1) # No match; |
match
re.match(pattern, string[, flags])
判断 pattern 是否在字符串开头位置匹配。对于 RegexObject,有:
match(string[, pos[, endpos]])
match() 函数只在字符串的开始位置尝试匹配正则表达式,也就是只报告从位置 0 开始的匹配情况,而 search() 函数是扫描整个字符串来查找匹配。如果想要搜索整个字符串来寻找匹配,应当用 search()。
1 2 |
>>> pattern.match('bca',2).group() 'a' |
虽然,match
默认是从开头匹配,但是,如果指定位置,仍然能成功;但是!match
也是从指定位置开始匹配,不匹配仍然会失败,这一点就和search
有区别啦。
match()
方法判断是否匹配,如果匹配成功,返回一个Match
对象,否则返回None
。
1 2 3 4 5 |
test = '用户输入的字符串' if re.match(r'正则表达式', test): print('ok') else: print('failed') |
split
re.split(pattern, string[, maxsplit=0, flags=0])
此功能很常用,可以将将字符串匹配正则表达式的部分割开并返回一个列表。对 RegexObject,有函数:
split(string[, maxsplit=0])
对于一个找不到匹配的字符串而言,split 不会对其作出分割
a{2,4}
会匹配 4 个 a
,但 a{2,4}?
只匹配 2 个 a
。
^
表示行的开头,^\d
表示必须以数字开头。
$
表示行的结束,\d$
表示必须以数字结束。
你可能注意到了,py
也可以匹配'python'
–>py
;
但是加上^py$
就变成了整行匹配,就只能匹配’py’了,匹配'python'
时,就什么也得不到。
参考表
正则表达式特殊序列
re模块
re.compile(pattern[, flags])
把正则表达式的模式和标识转化成正则表达式对象,供 match()
和 search()
这两个函数使用。
re 所定义的 flag 包括:
1 2 3 4 5 6 |
re.I 忽略大小写 re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境 re.M 多行模式 re.S 即为’ . ’并且包括换行符在内的任意字符(’ . ’不包括换行符) re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库 re.X 为了增加可读性,忽略空格和’ # ’后面的注释 |
以下两种用法结果相同:
(A)
1 2 |
compiled_pattern = re.compile(pattern) result = compiled_pattern.match(string) |
(B)
1 |
result = re.match(pattern, string) |
1 2 3 |
s = 'ABC\\-001' # Python的字符串 #对应的正则表达式字符串变成: #'ABC\-001' |
因此我们强烈建议使用Python的r前缀,就不用考虑转义的问题了
1 2 3 |
s = r'ABC\-001' # Python的字符串 # 对应的正则表达式字符串不变: # 'ABC\-001' |
search
re.search(pattern, string[, flags])
在字符串中查找匹配正则表达式模式的位置,返回 MatchObject
的实例,如果没有找到匹配的位置,则返回 None
。
对于已编译的正则表达式对象来说(re.RegexObject)
,有以下 search
的方法:
search (string[, pos[, endpos]])
若 regex
是已编译好的正则表达式对象,regex.search(string, 0, 50)
等同于 regex.search(string[:50], 0)
。
1 2 3 |
>>> pattern = re.compile("a") >>> pattern.search("abcde") # Match at index 0 >>> pattern.search("abcde", 1) # No match; |
match
re.match(pattern, string[, flags])
判断 pattern 是否在字符串开头位置匹配。对于 RegexObject,有:
match(string[, pos[, endpos]])
match() 函数只在字符串的开始位置尝试匹配正则表达式,也就是只报告从位置 0 开始的匹配情况,而 search() 函数是扫描整个字符串来查找匹配。如果想要搜索整个字符串来寻找匹配,应当用 search()。
1 2 |
>>> pattern.match('bca',2).group() 'a' |
虽然,match
默认是从开头匹配,但是,如果指定位置,仍然能成功;但是!match
也是从指定位置开始匹配,不匹配仍然会失败,这一点就和search
有区别啦。
match()
方法判断是否匹配,如果匹配成功,返回一个Match
对象,否则返回None
。
1 2 3 4 5 |
test = '用户输入的字符串' if re.match(r'正则表达式', test): print('ok') else: print('failed') |
split
re.split(pattern, string[, maxsplit=0, flags=0])
此功能很常用,可以将将字符串匹配正则表达式的部分割开并返回一个列表。对 RegexObject,有函数:
split(string[, maxsplit=0])