avatar

目录
python-正则表达式re模块

匹配单个字符

字符 功能
. 匹配任意1个字符(除了\n)
[ ] 匹配[ ]中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即 空格,tab键
\S 匹配非空白
\w 匹配单词字符,即a-z、A-Z、0-9、_
\W 匹配非单词字符

demo

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 匹配任意字符
ret = re.match("t.o","two")
# 提取数据
print(ret.group())
ret = re.match("速度与激情\d", "速度与激情8910哈哈哈123")
print(ret.group()) # "速度与激情8"

# 匹配[ ]中列举的字符
# 大小写都可以
ret = re.match("[hH]","hello Python")
ret = re.match("[hH]ello Python","Hello Python")

# 匹配0到9第一种写法
ret = re.match("[0123456789]Hello Python","7Hello Python")
ret = re.match("[0-9]Hello Python","7Hello Python")
# 匹配不到4
ret = re.match("[0-35-9]Hello Python","7Hello Python")

# 匹配数字,即0-9
ret = re.match("嫦娥\d号","嫦娥3号发射成功")

匹配多个字符

字符 功能
* 匹配前一个字符出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少有1次
? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m} 匹配前一个字符出现m次
{m,n} 匹配前一个字符出现从m到n次

demo

python
1
2
3
4
5
6
7
8
9
10
11
12
13
# 一个字符串第一个字母为大小字符,后面都是小写字母并且这些小写字母可有可无
ret = re.match("[A-Z][a-z]*","Aabcdef")
# 变量名是否有效:字母或下划线开头,后面跟任意字母数字下划线
ret = re.match("[a-zA-Z_]+[\w]*",name)
# 匹配出,0到99之间的数字
ret = re.match("[1-9]?[0-9]","7")
ret = re.match("[1-9]?\d","33")

# 匹配出,8到20位的密码,可以是大小写英文字母、数字、下划线
ret = re.match("[a-zA-Z0-9_]{8,20}","1ad12f23s34455ff66")
# 6位
ret = re.match("[a-zA-Z0-9_]{6}","12a3g45678")
print(ret.group()) # 12a3g4

匹配开头结尾

字符 功能
^ 匹配字符串开头
$ 匹配字符串结尾

demo

python
1
2
# 邮箱 必须com结尾
ret = re.match("[\w]{4,20}@163\.com$", email)

匹配分组

字符 功能
| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组
\num 引用分组num匹配到的字符串
(?P<name>) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串

demo

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 需求:匹配出0-100之间的数字
ret = re.match("[1-9]?\d$|100","78")

# 需求:匹配出163、126、qq邮箱
ret = re.match("\w{4,20}@(163|126|qq)\.com", "test@qq.com")

# 提取括号的值
# 提取区号和电话号码
ret = re.match("([^-]*)-(\d+)", "010-12345678")
print(ret.group()) # 010-12345678
print(ret.group(1)) # 010
print(ret.group(2)) # 12345678

# Python中字符串前面加上 r 表示原生字符串,不用担心是不是漏写了反斜杠
# \num 引用分组num匹配到的字符串
ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", "<html>hh</html>")

# (?P<name>) 分组起别名
# (?P=name) 引用别名为name分组匹配到的字符串
ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.itcast.cn</h1></html>")

re模块高级用法: search\findall\sub\split?

demo

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# search
# 需求:匹配出文章阅读的次数
ret = re.search(r"\d+", "阅读次数为 9999")
print(ret.group()) # 9999

# findall
# 需求:统计出python、c、c++相应文章阅读的次数
ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
print(ret) # ['9999', '7890', '12345']

# sub 将匹配到的数据进行替换
ret = re.sub(r"\d+", '998', "python = 997")
print(ret) # python = 998

# split 根据匹配进行切割字符串,并返回一个列表
ret = re.split(r":| ","info:xiaoZhang 33 shandong")
print(ret) # ['info', 'xiaoZhang', '33', 'shandong']

# 非贪婪操作符“?”,这个操作符可以用在"*","+","?"的后面,要求正则匹配的越少越好
>>> re.match(r"aa(\d+)","aa2343ddd").group(1)
'2343'
>>> re.match(r"aa(\d+?)","aa2343ddd").group(1)
'2'
# ------
>>> s="This is a number 234-235-22-423"
>>> r=re.match(".+(\d+-\d+-\d+-\d+)",s)
>>> r.group(1)
'4-235-22-423'
>>> r=re.match(".+?(\d+-\d+-\d+-\d+)",s)
>>> r.group(1)
'234-235-22-423'
>>>
文章作者: Machine
文章链接: https://machine4869.gitee.io/2019/02/25/20190225153607290/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 哑舍
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论