Python - re 模块

正则语法:https://www.runoob.com/regexp/regexp-syntax.html

入门案例

"""
# 用法一:
re.match(pattern, string)
pattern:  正则表达式
string: 要进行匹配的字符串

如果匹配成功返回Match Object
否则返回None

# 用法二,创建Pattern 对象
pattern  = re.compile('正则表达式')
pattern.findall(): 返回匹配到的字符串
pattern.search(): 返回Match对象
pattern.findter(): 返回一个可迭代对象
"""

import re

# \w => 匹配字母、数字、下划线。等价于 [A-Za-z0-9_]
match_obj = re.match('\w{4,20}@163\.com$', 'hello@163.com')
if match_obj:
    print(match_obj.group())
else:
    print('匹配失败')

分组匹配之 ()

"""

正则表达式中的() 代表分组匹配
match.groups(1): 获得第一个括号(分组)中匹配到的内容
match.groups(2): 获得第二个括号(分组)中匹配到的内容
match.groups():等价于(m.group(1), m.group(2), ...)
"""
import re

mathch = re.match('(\d{3,4})-(\d{7,8})', '010-12345678')

print(mathch.group())  # 010-12345678
print(mathch.group(1))  # 010
print(mathch.group(2))  # 12345678

分组配置之引用


"""
分组匹配之引用: \
"""

import re

# \1 的作用:引用第一个括号中的正则表达式
# \2 的作用:引用第二个括号中的正则表达式
m = re.match(r'<([A-Za-z0-9]+)><([A-Za-z0-9]+)>.*</\2></\1>', '<html><a>test</a></html>')
print(m.group())

分组匹配起别名 和 用别名

"""
分组匹配之
1.起别名:(?P<name1>)
2.用别名:(?P=name1)
"""
import re

m = re.match(r'<(?P<name1>[A-Za-z0-9]+)><(?P<name2>[A-Za-z0-9]+)>.*</(?P=name2)></(?P=name1)>', '<html><a>test</a></html><body>')
print(m.group())  # out: <html><a>test</a></html>

高级使用

"""
search(pattern, str): 搜索匹配,开头匹配不到会搜索整个字符串, 返回 Match 对象
match(pattern, str): 从字符串开头就开始匹配,如果开头匹配不到,就返回None
"""

import re

m = re.search('\d+' , '销量:1000')
# m = re.match('\d+' , '销量:1000')  # 匹配失败,因为字符串开头不是数字开头
if m:
    print(m.group())
else:
    print('匹配失败')

fandall

"""
 re.findall(pattern, str) -> list
 
 返回匹配到的所有值
"""

import re

re_list = re.findall('\d+' , '销量:1000,评论数:2000,浏览量:3000')

if re_list:
    print(re_list)   # ['1000', '2000', '3000']
else:
    print('匹配失败')

sub

"""
sub(pattern, repl, string):
将所有匹配到的内容替换为repl,返回结果是一个str
"""

import re

ret_str = re.sub('\d+' , '999', '销量:1000,评论数:2000,浏览量:3000')  #out:销量:999,评论数:999,浏览量:999

if ret_str:
    print(ret_str)
else:
    print('匹配失败')

finditer

p = re.compile(r'\d')   # 匹配一个数字
for match in p.finditer("sdfad-12312-31"):
    print(match.group())  # 获取匹配内容
    print(match.start())  # 获取匹配内容在原字符串中的开始位置
    print(match.end())  # 获取匹配内容在原字符串中的结束位置
    print(match.span()) # 以二元组的形式返回匹配内容在原字符串中的开始和结束的位置

#out:
"""
1
6
7
(6, 7)
2
7
8
(7, 8)
3
8
9
(8, 9)
1
9
10
(9, 10)
2
10
11
(10, 11)
3
12
13
(12, 13)
1
13
14
(13, 14)
"""

https://www.python100.com/html/B517NBH51P3W.html

posted @ 2022-01-12 22:57  chuangzhou  阅读(28)  评论(0编辑  收藏  举报