0 前言
正则表达式(英文名称:regular expression,regex,RE)是用来简洁表达一组字符串特征的表达式。最主要应用在字符串匹配中。
re模块是python中处理正则表达式的一个模块,通过re模块的方法,把正则表达式pattern编译成正则对象,以便使用正则对象的方法
1 re模块(内置库)
re模块是Python的内置库,无需安装
str为需要检索的字符串
pattern可以是两种数据类型,一种类型为正则表达式的字符串表达方式,如‘\d{9}’
。另一种是使用re.compile()方法将表达式编译为Pattern类
- pattern是字符串类型只能使用
re.match(pattern, str)
这样的写法 - pattern是Pattern类可以使用
re.match(pattern, str)
和pattern.match(str)
两种写法
事实上,每次re.match(pattern, str)
系统都会调用re.compile()
将pattern
从字符串处理为Pattern类,所以手动调用re.compile()
可以提高运行速度
编程语言将\
定义为转义字符,r
表示raw string 意思是原生字符,也就是说是这个字符串中间的特殊字符不用转义,比如你要表示‘\n’
,可以这样:r'\n'
,但是如果你不用原生字符而是用字符串你得这样:‘\\n’
。原生字符还有函数表示法repr(str)
re.match()
和re.search()
方法返回的是Match类,Match类可通过group()
方法得到对应的字符串
1.1 方法列表
re模块 | 说明 |
---|---|
re.compile(pattern) -> Pattern | 将字符串转为正则式,返回Pattern类pattern ->字符串 |
re.fullmatch(pattern, str) -> Matchre.fullmatch(pattern, str) -> None | 匹配整个字符串,返回Match类或None pattern ->正则式或字符串 |
re.match(pattern, str) -> Matchre.match(pattern, str) -> None | 从头开始检测匹配的第一个子串,返回Match类或None pattern ->正则式或字符串 |
re.search(pattern, str) -> Matchre.search(pattern, str) -> None | 检测第一个匹配的子串,返回Match类或None pattern ->正则式或字符串 |
re.findall(pattern, str) -> list of strre.findall(pattern, str) -> [] | 返回匹配的子串的列表pattern ->正则式或字符串 |
re.finditer(pattern, str) -> Iter of strre.finditer(pattern, str) -> None | 返回匹配的子串的迭代器pattern ->正则式或字符串 |
re.split(pattern, str) -> list of str | 按pattern子串分割str,返回列表 pattern子串自身占一个空字符串元素 pattern ->正则式或字符串 |
re.sub(pattern, repl, str) -> str | 将str中满足正则式的子串替换为replpattern ->正则式或字符串repl ->字符串 |
re.subn(pattern, repl, str) -> (str, num) | 将sub() 的结果和替换次数打包为元组,返回元组pattern ->正则式或字符串repl ->字符串 |
self=Pattern类 | 说明 |
---|---|
self.fullmatch(str) -> Matchself.fullmatch(str) -> None | 匹配整个字符串,返回Match类或None |
self.match(str) -> Matchself.match(str) -> None | 从头开始检测匹配的第一个子串,返回Match类或None |
self.search(str) -> Matchself.search(str) -> None | 检测第一个匹配的子串,返回Match类或None |
self.findall(str) -> list of strself.findall(str) -> [] | 搜索str返回匹配的子串的列表,返回列表 |
self.finditer(str) -> Iter of strself.finditer(str) -> None | 搜索str返回匹配的子串的迭代器,返回迭代器 |
self.split(str) -> list of str | 按pattern子串分割str pattern子串自身占一个空字符串元素,返回列表 |
self.sub(repl, str) -> str | 将str中满足正则式的子串替换为repl,返回字符串 |
self.subn(repl, str) -> (str, num) | 将sub() 的结果和替换次数打包为元组,返回元组 |
self=Match类 | 说明 |
---|---|
self.group(n) -> str | 将Match类转为字符串n ->省略或为0时,返回所有结果,n =1返回第一个结果 |
2 正则表达式
2.1 单字符匹配符号
此处所有语法都代表一个字符,尤其是中括号[]
中的内容无论有多长,都只会匹配一个字符
注意,转义的\n
, \t
是一个字符,而未转义的r'\n'
, r'\t'
是两个字符,正则表达式都是用未转义字符
单字符匹配符号 | 说明 |
---|---|
. | 匹配一个任意字符,除\n 以外,等效为[^\n] |
\w | 匹配一个变量字符,包括数字,字母或者下划线字符,等效为[0-9a-zA-Z_] |
\W | 匹配一个非变量字符,等效为[^w] |
\s | 匹配一个空白字符,包括空格,\n 或者\t ,等效为[ \n\t] |
\S | 匹配一个非空白字符,等效为[^s] |
\d | 匹配一个数字字符,等效为[0-9] |
\D | 匹配一个非数字字符,等效为[^d] |
[pattern] | 匹配括号中出现的任意一个字符或者Unicode编码区间内任意一个字符 如 [abc] , [\d+] , [1-9] , [a-z] , [A-Z] , [a-Z] |
[^pattern] | 匹配括号中没出现的任意一个字符或者Unicode编码区间外任意一个字符 如 [^abc] , [^\d+] , [^1-9] , [^a-z] , [^A-Z] , [^a-zA-Z] |
[] | 在[] 中的符号作为纯文本,不具有特殊定义,如匹配括号用[(][)] |
2.2 多字符匹配符号
使用小括号()
包围的连续字符视为一个整体进行逻辑处理
(pattern)
表示获取()
内容,(?:pattern)
表示不获取()
内容
- 当正则式中没有
()
时,默认获取整个正则式匹配的内容 - 当正则式中有一个
()
时,在整个正则式匹配的基础上,获取()
内的内容 - 当正则式中有多个
()
时,在整个正则式匹配的基础上,以元组方式获取所有()
内的内容
多字符匹配符号 | 说明 |
---|---|
(pattern) | 将多个字符匹配符号组成块,统一进行处理并获取内容 |
(?:pattern) | 将多个字符匹配符号组成块,统一进行处理但不获取内容 |
(pattern1|pattern2) | 多个字符块只需要匹配一个,但第一个成功后不会再尝试匹配第二个 如 r'(aa|bb)' 匹配aa 或者bb ,而r'aa|bb' 匹配aab 或abb |
(?:pattern1|pattern2) | 多个字符块只需要匹配一个,但不获取内容 |
2.3 次数检测符号
贪婪匹配返回符合条件的最大匹配区间,非贪婪匹配返回符合条件的最小匹配区间
次数检测符号 | 说明 |
---|---|
? | 上个单字符或多字符匹配0次或1次,等效于{0,1} ,非贪婪匹配 |
* | 上个单字符或多字符匹配0次或多次,等效于{0,} ,贪婪匹配 |
+ | 上个单字符或多字符匹配1次或多次,等效于{1,} ,贪婪匹配 |
+? | 上个单字符或多字符匹配1次或多次,等效于{1,}? ,非贪婪匹配 |
{} | 指定上个单字符或多字符次数,{N} 匹配N次,{M,N} 匹配M到N次 ,{M,} 至少匹配M次 ,{,N} 最多匹配N次,贪婪匹配 |
{}? | 指定上个单字符或多字符次数,{N} 匹配N次,{M,N} 匹配M到N次 ,{M,} 至少匹配M次 ,{,N} 最多匹配N次,非贪婪匹配 |
2.4 位置检测符号
位置检测符号 | 说明 |
---|---|
\b | 检测\b 出现的位置是单词边界,\b 本身不占字符单词边界: 字符串开始和结尾、空格、换行、标点符号等,可以将两个单词隔开的字符都单词边界 |
\B | 检测\B 出现的位置不是单词边界 |
^pattern | 检测pattern 是否是字符串开头 |
pattern$ | 检测pattern 是否是字符串结尾 |
3 示例
- 贪婪匹配与非贪婪匹配
result = re.findall('\w+', 'fun%_list')
print(result)
>>>['fun', '_list']
result = re.findall('\w+?', 'fun%_list')
print(result)
>>>['fun', '_list']
- 获取和非获取
result = re.findall('\w+%_\w+', 'fun%_list')
print(result)
>>>['fun_list']
result = re.findall('(\w+)%_\w+', 'fun%_list')
print(result)
>>>['fun']
result = re.findall('(\w+)%_(\w+)', 'fun%_list')
print(result)
>>>[('fun', 'list')]