正则表达式,是一种语法,用来描述你想搜索的字符串的特征。
元字符(metacharacters)
它们出现在正则表达式字符串中,不是表示直接匹配他们, 而是表达一些特别的含义。
re.compile
函数返回的是 正则表达式对象
,它对应的匹配规则在参数中进行定义
-
.
:表示要匹配除了换行符
之外的任何单个
字符。pythonimport re content = """ 蓝色的天空 白色的云彩 红色的太阳 """ p = re.compile('.色的') for v in p.findall(content): print(v) # 蓝色的 # 白色的 # 红色的
-
*
:表示匹配前面的子表达式任意次,包括0次。pythonimport re content = """ 苹果,是绿色的 橙子,是橙色的 香蕉,是黄色的 乌鸦,是黑色的 猴子, """ # 匹配逗号后面的所有内容(包含逗号) p = re.compile(',.*') for v in p.findall(content): print(v) # ,是绿色的 # ,是橙色的 # ,是黄色的 # ,是黑色的 # ,
.*
在正则表达式中非常常见,表示匹配任意字符任意次数。 -
+
:表示匹配前面的子表达式 一次或多次,不包括0次。pythonimport re content = """ 苹果,是绿色的 橙子,是橙色的 香蕉,是黄色的 乌鸦,是黑色的 猴子, """ # p = re.compile(',.+') for v in p.findall(content): print(v) # ,是绿色的 # ,是橙色的 # ,是黄色的 # ,是黑色的
-
?
:表示匹配前面的子表达式0次或1次。pythonimport re content = """ 苹果,是绿色的 橙子,是橙色的 香蕉,是黄色的 乌鸦,是黑色的 猴子, """ # p = re.compile(',.?') for v in p.findall(content): print(v) # ,是 # ,是 # ,是 # ,是 # ,
-
{}
: 前面的字符匹配指定的次数 。匹配完成
text[st:ed]
部分,将从 e d ed ed后面开始,不会有重叠**。pythonimport re content = """ 红彤彤,绿油油,黑乎乎,绿油油油油 """ # p = re.compile('油{3,4}') for v in p.findall(content): print(v) # 油油油油 p = re.compile('油{2}') for v in p.findall(content): print(v) # 油油 # 油油 # 油油
贪婪模式和非贪婪模式
*
,+
,?
都是贪婪模式,使用他们时,会尽可能多的匹配内容。
python
import re
content = """
<html><head><title>Title</title>
"""
#
p = re.compile('<.*>')
for v in p.findall(content):
print(v)
# <html><head><title>Title</title>
python
import re
content = """
<html><head><title>Title</title>
"""
#
p = re.compile('<.*?>')
for v in p.findall(content):
print(v)
# <html>
# <head>
# <title>
# </title>
-
\
:在正则表达式中有多种用途。- 可以对元字符进行转义:
pythonimport re content = """ 苹果.是绿色的 橙子.是橙色的 香蕉.是黄色的 """ # p = re.compile('.*\.') for v in p.findall(content): print(v) # 苹果. # 橙子. # 香蕉.
-
匹配某种字符类型
反斜杠后面接一些字符,表示匹配
某种类型
的一个字符。\what 含义 \d 匹配0-9之间任意一个数字字符 \D 匹配一个非0-9的任意字符 \s 匹配一个空白字符,包含 空格、tab、换行符 \S 匹配一个非空白字符 \w 匹配任意一个文字字符,包括大小写字母、数字、下划线 \W 匹配任意一个非文字字符 小写是匹配,大写是不匹配。
-
[]
:匹配几个字符之一[abc]
表示匹配a,b,c
中的一个。[a-c]
表示匹配a
到c
中的一个。匹配所有的小写字符:
[a-z]
[^\d]
表示选择非数字字符 -
^
:表示匹配文本的开头
位置。正则表达式可以设定
单行模式
和多行模式
-
如果是
单行模式
,表示匹配整个文本
的开头位置。 -
如果是
多行模式
,表示匹配文本每行
的开头位置。
pythonimport re content = """001-苹果价格-60 002-橙子价格-70 003-香蕉价格-80 """ # 单行模式 p = re.compile('^\d+') for v in p.findall(content): print(v) # 001 # 多行模式 p = re.compile('^\d+', re.M) for v in p.findall(content): print(v) # 001 # 002 # 003
-
-
$
:表示匹配文本的结尾
位置。如果是
单行模式
,表示匹配整个文本
的结尾位置。如果是
多行模式
,表示匹配文本每行
的结尾位置。pythonimport re content = """ 001-苹果价格-60 002-橙子价格-70 003-香蕉价格-80 """ # 单行模式 p = re.compile('\d+$') for v in p.findall(content): print(v) # 80 # 多行模式 p = re.compile('\d+$', re.M) for v in p.findall(content): print(v) # 60 # 70 # 80
-
|
:匹配其中之一。pythonimport re content = """ 001-苹果价格-60 002-橙子价格-70 003-香蕉价格-80 """ p = re.compile('-.[果|子|蕉]') for v in p.findall(content): print(v) # -苹果 # -橙子 # -香蕉