正则表达式:是记录文本规则的代码,用来匹配或查找符合某些规则的字符串数据
特点:可读性差,通用性强,能适用于很多编程语言
re模块的使用
import re
print('-------------简单使用-------------')
# result = re.match('hello', 'Hello135helloHELLO hehehellohell')
result = re.search('hello', 'Hello135helloHELLO hehehellohell')
data = result.group()
print(data)输出:
-------------简单使用-------------
hello
模式代码 | 功能描述 |
. | 匹配除换行符(\n)外的任意一个字符 |
[ ] | 匹配[ ]中列举的字符 |
[^指定字符] | 匹配[ ]中除指定字符外的字符 |
\d | 匹配任意数字,等价于[0-9] |
\D | 匹配任意非数字 |
\s | 匹配任意空白字符,等价于[\n\r\t\f] |
\S | 匹配任意非空白字符 |
\w | 匹配任意非特殊字符,即数字、字母、下划线、汉字 |
\W | 匹配任意特殊字符,即非数字、字母、下划线、汉字 |
举例如下
print('--------------------匹配单个字符--------------------')
print('.匹配任意一个字符:', re.match('.', 'helloChina').group(), re.match('i.you', 'i&you').group()) # 输出:h i&you
print(re.match('i.you', 'i爱you'), '||', re.match('i.you', 'i爱you').group()) # || i爱youprint('[hi]匹配以字母h或i开头的字符:', re.match('[hi]', 'helloChina').group(), re.match('[hi]', 'i&you').group()) # h i
print('[^hi]匹配不是以字母h或i开头的字符:', re.match('[^hi]', 'elloChina').group(), re.match('[^hi]', '&you').group()) # e &
print(re.match('[0-9]hello', '2helloChina').group(), re.match('[0-9]i&you', '3i&you').group()) # 2hello 3i&you
print('[0-35-9]hello匹配0-3和5-9之间的一个数字:', re.match('[0-35-9]hello', '4hello')) # 输出None,加上.group()后报错,匹配0-3或5-9之间的数字,不包含4print('\\d匹配任意数字:', re.match('第\\d天', '第2天了').group(), re.match('第\\d天', '第5天了').group()) # 第2天 第5天
print('\\D匹配任意非数字:', re.match('第\\D天', '第二天了').group(), re.match('第\\D天', '第n天了').group()) # 第二天 第n天print('\\s匹配任意空白字符:', re.match('Hello\\sChina!', 'Hello China!').group(), re.match('Hello\\sChina!', 'Hello\tChina!').group()) # Hello China! Hello China!
print('\\S匹配任意非空白字符:', re.match('Hello\\SChina!', 'Hello*China!').group(), re.match('Hello\\SChina!', 'Hello啊China!').group()) # Hello*China! Hello啊China!print('\\w匹配任意非特殊字符:', re.match('Hello\\wChina!', 'Hello_China!').group(), re.match('Hello\\wChina!', 'Hello啊China!').group()) # Hello_China! Hello啊China!
print('\\W匹配任意特殊字符:', re.match('Hello\\WChina!', 'Hello%China!').group(), re.match('Hello\\WChina!', 'Hello!China!').group()) # Hello%China! Hello!China!输出:
--------------------匹配单个字符--------------------
.匹配任意一个字符: h i&you
|| i爱you
[hi]匹配以字母h或i开头的字符: h i
[^hi]匹配不是以字母h或i开头的字符: e &
2hello 3i&you
[0-35-9]hello匹配0-3和5-9之间的一个数字: None
\d匹配任意数字: 第2天 第5天
\D匹配任意非数字: 第二天 第n天
\s匹配任意空白字符: Hello China! Hello China!
\S匹配任意非空白字符: Hello*China! Hello啊China!
\w匹配任意非特殊字符: Hello_China! Hello啊China!
\W匹配任意特殊字符: Hello%China! Hello!China!
模式代码 | 功能描述 |
* | 匹配其前一个字符任意次 |
+ | 匹配其前一个字符 ≥1 次 |
? | 匹配其前一个字符0或1次 |
{m} | 匹配其前一个字符m次 |
{m,n} | 匹配其前一个字符m~n次 |
举例如下
print('-----------------------------匹配多个字符------------------------------')
print('[0-9]\\w*匹配第一个字符为数字,后面任意多个为非特殊字符:', re.match('Hello[0-9]\\w*China!', 'Hello123HElo_中国China!').group())
print('\\S*匹配任意多个非空白字符:', re.match('Hello\\S*China!', 'Hello*he&L+LO_你好!China!').group())print('[0-9]\\w+匹配第一个字符为数字,后面 ≥1 个非特殊字符:', re.match('Hello[0-9]\\w+China!', 'Hello123HElo_中国China!').group())
print('\\S+匹配 ≥1 个非空白字符:', re.match('Hello\\S+China!', 'Hello*he&L+LO_你好!China!').group())print('[0-9]\\w?匹配第一个字符为数字,后面 0或1 个非特殊字符:', re.match('Hello[0-9]\\w?China!', 'Hello1China!').group())
print('\\S?匹配 0或1 个非空白字符:', re.match('Hello\\S?China!', 'Hello!China!').group())print('[a-z0-9]\\w{0,10}匹配第一个字符为小写字母或数字,后面 0~10 个非特殊字符:', re.match('Hello[a-z0-9]\\w{0,10}China!', 'HellooHELLo_China!').group())
print('\\S{0,10}匹配 0~10 个非空白字符:', re.match('Hello\\S{0,10}China!', 'Hello!你好*China!').group())输出:
-----------------------------匹配多个字符------------------------------
[0-9]\w*匹配第一个字符为数字,后面任意多个为非特殊字符: Hello123HElo_中国China!
\S*匹配任意多个非空白字符: Hello*he&L+LO_你好!China!
[0-9]\w+匹配第一个字符为数字,后面 ≥1 个非特殊字符: Hello123HElo_中国China!
\S+匹配 ≥1 个非空白字符: Hello*he&L+LO_你好!China!
[0-9]\w?匹配第一个字符为数字,后面 0或1 个非特殊字符: Hello1China!
\S?匹配 0或1 个非空白字符: Hello!China!
[a-z0-9]\w{0,10}匹配第一个字符为小写字母或数字,后面 0~10 个非特殊字符: HellooHELLo_China!
\S{0,10}匹配 0~10 个非空白字符: Hello!你好*China!
模式代码 | 功能描述 |
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
举例如下
print('------------------------------匹配字符串开头与结尾--------------------------')
print('^\\S{0,10}匹配 0~10 个以非空白字符开头的字符:', re.match('^\\S{0,10}China!', 'Hello!你好*China!').group())
print('.*\\d$匹配以数字结尾的字符,其前含任意多个字符:', re.match('China!.*\\d$', 'China!Hello!你好_520').group())
print('^\\D.*China!.*\\d$匹配以任意非数字字符开头,其后可含任意多个任意字符,以数字结尾的字符,其前可含任意多个字符任意字符:', re.match('^\\D.*China!.*\\d$', '你好Hello_520!China!Hello!你好_520').group())print('[^helo]匹配不是以h、e、l、o字符开头的任意字符字符:', re.match('[^helo].*China!', '你好——Hello!你好*China!').group())输出:
------------------------------匹配字符串开头与结尾--------------------------
^\S{0,10}匹配 0~10 个以非空白字符开头的字符: Hello!你好*China!
.*\d$匹配以数字结尾的字符,其前含任意多个字符: China!Hello!你好_520
^\D.*China!.*\d$匹配以任意非数字字符开头,其后可含任意多个任意字符,以数字结尾的字符,其前可含任意多个字符任意字符: 你好Hello_520!China!Hello!你好_520
[^helo]匹配不是以h、e、l、o字符开头的任意字符字符: 你好——Hello!你好*China!
模式代码 | 功能描述 |
| | 匹配左右任意一个表达式,如a|b表示匹配a或b |
(表达式) | 匹配括号内的表达式,将括号中表达式作为一个分组 |
\i | 引用第i个分组匹配到的字符串 |
(?P | 分组起别名,写在分组括号()内 |
(?P=name) | 引用别名为name分组匹配到的字符串 |
举例如下
print('-------------------------匹配分组----------------------------')
list = ['Chinese', 'math', 'English', 'physical', 'history']
for v in list:match_boject = re.match('Chinese|math|history', v)if match_boject:print('我喜欢%s' % match_boject.group())else:print('我讨厌%s' % v)print('------------------------(字符)分组--一个()即为一个分组------------------------')
# 想要提取哪一部分数据,就可使用分组括起来,通过group(i)来获取,i即表示第i个分组
match_object = re.match('[_0-9a-zA-Z]{5,10}@(qq|163|sina|gmail)\.(com)', 'Hello_520@qq.com') # \.表示转义,只能匹配点.字符
if match_object:print('匹配到的QQ邮箱为:', match_object.group()) # 与match_object.group(0)结果相同,即将整个表达式看作一个分组print('匹配到的第一个分组数据为:', match_object.group(1), '第二个分组数据为:', match_object.group(2)) # 1为第一个分组,2即第二个分组,依次递推
else:print('未匹配到所需邮箱')
print('------------------------\数字--引用分组----------------------')
# 想要提取哪一部分数据,就可使用分组括起来,通过group(i)来获取,i即表示第i个分组
# \\i 表示引用第i个分组,相当于复制了该引用的分组
print('-------------不使用引用-----------')
match_object = re.match('<[0-9a-zA-Z]+><[0-9a-zA-Z]+>.*[0-9a-zA-Z]+>[0-9a-zA-Z]+>', 'www.xqnav.top') # 不使用引用,与不匹配也同样匹配成功
if match_object:print('匹配结果为:', match_object.group())
else:print('匹配失败')
print('-------------使用引用------------')
match_object = re.match('<([0-9a-zA-Z]+)><([0-9a-zA-Z]+)>.*\\2>\\1>', 'www.xqnav.top
') # \\1表示真正的\1,表示对前面第一个分组的引用
if match_object:print('匹配结果为:', match_object.group())print('匹配到的第一个分组数据为:', match_object.group(1), '第二个分组数据为:', match_object.group(2))
else:print('匹配失败')
print('-------------使用引用----起别名--------')
# (?P):给分组起别名
# (?P=name):引用别名为name分组匹配到的字符串
match_object = re.match('<(?P[0-9a-zA-Z]+)><(?P[0-9a-zA-Z]+)>.*(?P=name2)>(?P=name1)>', 'www.xqnav.top
') # \\1表示真正的\1,表示对前面第一个分组的引用
if match_object:print('匹配结果为:', match_object.group())print('匹配到的第一个分组数据为:', match_object.group(1), '第二个分组数据为:', match_object.group(2))
else:print('匹配失败')输出:
-------------------------匹配分组----------------------------
我喜欢Chinese
我喜欢math
我讨厌English
我讨厌physical
我喜欢history
------------------------(字符)分组--一个()即为一个分组------------------------
匹配到的QQ邮箱为: Hello_520@qq.com
匹配到的第一个分组数据为: qq 第二个分组数据为: com
------------------------\数字--引用分组----------------------
-------------不使用引用-----------
匹配结果为: www.xqnav.top
-------------使用引用------------
匹配结果为: www.xqnav.top
匹配到的第一个分组数据为: html 第二个分组数据为: h2
-------------使用引用----起别名--------
匹配结果为: www.xqnav.top
匹配到的第一个分组数据为: html 第二个分组数据为: h2
注:正则表达式中带反斜杠\的最好在其前多加一条反斜杠,即改为双反斜杠\\,如\\d
1.未写为双反斜杠形式,会报PEP 8规范警告,如下
PEP 8: W605 invalid escape sequence '\d'
2.单词拼写正确性警告:Typo: In word 'xxx'
学习导航:http://xqnav.top/
上一篇:接口优化及问题