# 正则表达式
# 使用
soup = re.compile(r"正则表达式")
for item in soup.findall(文本):
print(item)
# 匹配规则
元字符转义:在匹配字符前加\
即可表示字符本身
- \d : 匹配 0-9 之间任意一个数字字符,等价于表达式 [0-9]
- \D : 匹配任意一个不是 0-9 之间的数字字符,等价于表达式 [^0-9]
- \s : 匹配任意一个空白字符,包括 空格、tab、换行符等,等价于表达式 [\t\n\r\f\v]
- \S : 匹配任意一个非空白字符,等价于表达式 [^ \t\n\r\f\v]
- \w : 匹配任意一个文字字符,包括大小写字母、数字、下划线,等价于表达式 [a-zA-Z0-9_] 缺省情况也包括 Unicode 文字字符,如果指定 ASCII 码标记,则只包括 ASCII 字母
- \W : 匹配任意一个非文字字符,等价于表达式 [^a-za-z0-9_]
# 匹配所有字符:.
.
表示匹配除了换行符之外的任何单个字符
text = """
苹果是绿色的
橙子是橙色的
香蕉是黄色的
乌鸦是黑色的
"""
soup = re.compile(r".色")
for item in soup.findall(text):
print(item)
"""
输出:
绿色
橙色
黄色
黑色
"""
# 重复匹配任意次:*
*
表示匹配前面的子表达式任意次,包括 0 次
text = """
苹果,是绿色的
橙子,是橙色的
香蕉,是黄色的
乌鸦,是黑色的
猴子,
"""
# 匹配"."任意次
soup = re.compile(r",.*")
for item in soup.findall(text):
print(item)
"""
输出:
,是绿色的
,是橙色的
,是黄色的
,是黑色的
,
"""
# 重复匹配多次:+
+
表示匹配前面的子表达式一次或多次,不包括 0 次,至少需要出现一次
text = """
苹果,是绿色的
橙子,是橙色的
香蕉,是黄色的
乌鸦,是黑色的
猴子,
"""
soup = re.compile(r",.+")
for item in soup.findall(text):
print(item)
"""
输出:
,是绿色的
,是橙色的
,是黄色的
,是黑色的
"""
# 匹配指定次数:{}
{n}
表示匹配前面的子表达式 n 次
{n,m}
表示匹配前面的子表达式,最少 n 次,最多 m 次
text = """
红彤彤,绿油油,黑乎乎,绿油油油油
"""
soup = re.compile(r"绿.{2}")
for item in soup.findall(text):
print(item)
"""
输出:
绿油油
绿油油
"""
# 匹配几个字符之一: []
[]
表示匹配方括号内的任意一个字符,方括号内也可出现匹配符(.
不适用)
如果在方括号内使用^
,表示非
方括号内的字符集合
text = """
张三,手机号码15945678901
李四,手机号码13945677701
王二,手机号码13845666901
"""
# 匹配13或15开头的手机号码
soup = re.compile(r"1[35]\d{9}")
for item in soup.findall(text):
print(item)
# 匹配13-16开头的手机号码
soup = re.compile(r"1[3-6]\d{9}")
for item in soup.findall(text):
print(item)
# 起始位置
^
表示匹配文本的开头
位置
- 如果是
单行模式
,表示匹配整个文本
的开头位置 - 如果是
多行模式
,表示匹配文本每行
的开头位置
# 结尾位置
$
表示匹配文本的结尾
位置
- 如果是
单行模式
,表示匹配整个文本
的结尾位置 - 如果是
多行模式
,表示匹配文本每行
的结尾位置
# 多行模式
在 Python 中,默认为单行模式(基于所有文本内容)
soup = re.compile(r"正则表达式", re.M)
for item in soup.findall(文本):
print(item)
# 分组
组
就是把 正则表达式 匹配的内容 里面 其中的某些部分
标记为某个组
以提取已经匹配的 内容里面的 某些部分的核心内容
text = """
苹果,苹果是绿色的
橙子,橙子是橙色的
香蕉,香蕉是黄色的
"""
soup = re.compile(r"(.+),")
for item in soup.findall(text):
print(item)
"""
输出:
苹果
橙子
香蕉
"""
text = """张三,手机号码15945678901
李四,手机号码13945677701
王二,手机号码13845666901"""
# 将姓名、手机号码 进行分组显示
soup = re.compile(r"(.+),.+(\d{11})")
for item in soup.findall(text):
print(item)
"""
输出:
('张三', '15945678901')
('李四', '13945677701')
('王二', '13845666901')
"""
# 贪婪模式和非贪婪模式
*
、+
、?
都是尽可能的多的匹配内容,加上?
可使用非贪婪模式
text = """
<html><head><title>Title</title>
"""
soup = re.compile(r"<.*?>")
for item in soup.findall(text):
print(item)
"""
不加? 输出:['<html><head><title>Title</title>']
输出:
<html>
<head>
<title>
</title>
"""
# 分割字符串
text = re.split(r"正则表达式", 文本)
print(text)
text = "关羽; 张飞, 赵云,马超, 黄忠 李逵"
soup = re.split(r"[;,\s]\s*", text)
print(soup)
"""
输出:
['关羽', '张飞', '赵云', '马超', '黄忠', '李逵']
"""