<h1 id="正则表达式" data-source-line="1">正则表达式
<h3 id="应用场景" data-source-line="3">应用场景
<ul data-source-line="5">
只要是能够使用字符串函数解决的问题,就不要使用正则
- 正则的效率较低,还会降低代码的可读性
- 世界上最难理解的三样东西:医生的处方、道士的神符、码农的正则
- 提醒:正则是用来写的,不是用来读的;在不知道功能的情况下,不要试图阅读别人的正则。
说明:正则的解析处理是由re
模块完成
-
相关函数:
- match:从开头进行匹配,匹配到就返回正则结果对象,没有就返回None
- search:从任意位置匹配,匹配到一次就返回,没有就返回None
<span style="color: #008000">#<span style="color: #008000"> 只从开头匹配,找到返回一个正则结果对象,没有找到返回None<span style="color: #008000">
<span style="color: #008000"> m = re.match('abc','abcsdhasdasjabcweuqo')<span style="color: #008000">
<span style="color: #008000"> 全部匹配,只要找到就停止并返回
m = re.search(<span style="color: #800000">'<span style="color: #800000">abc<span style="color: #800000">',<span style="color: #800000">'<span style="color: #800000">sdhabcsdasjabcweuqo<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">if<span style="color: #000000"> m:
<span style="color: #008000">#<span style="color: #008000"> 提取匹配到的内容
<span style="color: #0000ff">print<span style="color: #000000">(m.group())
<span style="color: #008000">#<span style="color: #008000"> 获取匹配位置
<span style="color: #0000ff">print(m.span())
- findall:全局匹配,返回匹配到的结果列表,没有时返回空列表
内容,返回匹配结果组成的列表,若没有则返回空列表
f = re.findall(,(type(f))
- compile:生成正则表达式对象
生成正则表达式对象,用于正则匹配
c = re.compile(<span style="color: #008000">#<span style="color: #008000"> 从开头进行匹配<span style="color: #008000">
<span style="color: #008000"> m = c.match('hellosdsjldkabc')<span style="color: #008000">
<span style="color: #008000"> 从任意位置匹配
m = c.search(<span style="color: #800000">'<span style="color: #800000">shdjkhelloaskjdha<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">if<span style="color: #000000"> m:
<span style="color: #0000ff">print<span style="color: #000000">(m.group())
<span style="color: #008000">#<span style="color: #008000"> 匹配所有
f = c.findall(<span style="color: #800000">'<span style="color: #800000">helloasjdhakhello<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">if<span style="color: #000000"> f:
<span style="color: #0000ff">print(f)
将正则的匹配分两步完成:先创建正则对象,然后通过对象的match、search、findall方法完成匹配
单个字符:
-z]:a~-9]:0~-Z0-9^-9^0-9中文)、下划线等(就是字)
\W:所有的非字字符(\w的取反)
\s:所有的空白字符(\n、\t、\t、空格等)
\S:所有的非空白字符
\b:词边界匹配(开头、结尾、标点、空格)
\B:非词边界匹配
-
次数控制
<pre data-source-line="94"><code class="hljs"><span class="xml">
正则的匹配默认都是贪婪的(最大限度的匹配)
-
边界限定
<span style="color: #008000">#<span style="color: #008000"> 以指定的内容开头<span style="color: #008000">
<span style="color: #008000"> c = re.compile(r'^abc')<span style="color: #008000">
<span style="color: #008000"> 以指定的内容结尾
c = re.compile(r<span style="color: #800000">'<span style="color: #800000">kas$<span style="color: #800000">'<span style="color: #000000">)
s = c.search(<span style="color: #800000">'<span style="color: #800000">abcsdhkas<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">if<span style="color: #000000"> s:
<span style="color: #0000ff">print(s.group())
-
优先级控制
- |:表示或,它拥有最低的优先级
- ():用于表示一个整体,明确的指定优先级
- 示例:
c = re.compile(r<span style="color: #800000">'<span style="color: #800000">a(hello|world)b<span style="color: #800000">'<span style="color: #000000">)
s = c.search(<span style="color: #800000">'<span style="color: #800000">aworldb<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">if<span style="color: #000000"> s:
<span style="color: #0000ff">print(s.group())
-
分组匹配
- 说明:()不但可以作为一个整体,还可以进行分组匹配
- 示例1:
c = re.compile(r<span style="color: #800000">'<span style="color: #800000">(\d+)([a-z]+)(\d+)<span style="color: #800000">'<span style="color: #000000">)
s = c.search(<span style="color: #800000">'<span style="color: #800000">shd327sjahdajhsd87892ehawksd<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">if<span style="color: #000000"> s:
<span style="color: #0000ff">print<span style="color: #000000">(s.group())
<span style="color: #008000">#<span style="color: #008000"> 默认就是全部的匹配内容,等价于上式
<span style="color: #0000ff">print<span style="color: #000000">(s.group(0))
<span style="color: #008000">#<span style="color: #008000"> 第一个()匹配到的内容
<span style="color: #0000ff">print(s.group(1<span style="color: #000000">))
<span style="color: #0000ff">print(s.group(2<span style="color: #000000">))
<span style="color: #0000ff">print(s.group(3<span style="color: #000000">))
<span style="color: #0000ff">print<span style="color: #000000">(s.span())
<span style="color: #0000ff">print<span style="color: #000000">(s.span(0))
<span style="color: #0000ff">print(s.span(1<span style="color: #000000">))
<span style="color: #0000ff">print(s.span(2<span style="color: #000000">))
<span style="color: #0000ff">print(s.span(3))
- 示例2:给分组起名字
<span style="color: #008000">#<span style="color: #008000"> 固定匹配<span style="color: #008000">
<span style="color: #008000"> c = re.compile(r'')<span style="color: #008000">
<span style="color: #008000"> \1表示前面第一个小括号匹配的内容<span style="color: #008000">
<span style="color: #008000"> c = re.compile(r'<([a-z]+)><([a-z]+)>\w+</\2></\1>')<span style="color: #008000">
<span style="color: #008000"> 给()起名字
c = re.compile(r<span style="color: #800000">'<span style="color: #800000"><(?P[a-z]+)><(?P[a-z]+)>\w+</(?P=ergou)></(?P=goudan)><span style="color: #800000">'<span style="color: #000000">)
s = c.search(<span style="color: #800000">'<span style="color: #800000">
<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">if<span style="color: #000000"> s:
<span style="color: #0000ff">print(s.group())
-
贪婪匹配
- 贪婪:最大限度的匹配叫贪婪。正则的匹配默认是贪婪。
- 非贪婪:只要满足匹配条件,能少匹配就少匹配;通过可以使用'?'进行取消贪婪
- 示例:
<span style="color: #008000">#<span style="color: #008000"> 取消任意多次的贪婪<span style="color: #008000">
<span style="color: #008000"> c = re.compile(r'a.*?b')<span style="color: #008000">
<span style="color: #008000"> 取消至少一次的贪婪
c = re.compile(r<span style="color: #800000">'<span style="color: #800000">a.+?b<span style="color: #800000">'<span style="color: #000000">)
s = c.search(<span style="color: #800000">'<span style="color: #800000">abdhsadjbsdjabs<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">if<span style="color: #000000"> s:
<span style="color: #0000ff">print(s.group())
-
匹配模式
- 说明:所谓模式就是对匹配的原则进行整体的修饰
- 示例:
<span style="color: #008000">#<span style="color: #008000"> 忽略大小写的匹配<span style="color: #008000">
<span style="color: #008000"> c = re.compile(r'hello',re.I)<span style="color: #008000">
<span style="color: #008000"> s = c.search('Hello world')
<span style="color: #008000">#<span style="color: #008000"> 进行多行匹配,默认单行匹配<span style="color: #008000">
<span style="color: #008000"> c = re.compile(r'^hello',re.M)<span style="color: #008000">
<span style="color: #008000"> s = c.search('world \nhello')
<span style="color: #008000">#<span style="color: #008000"> 做为单行处理 或 让 . 能够匹配 \n
c = re.compile(r<span style="color: #800000">'<span style="color: #800000">
.*?<span style="color: #800000">'<span style="color: #000000">,re.S)
<span style="color: #008000">#<span style="color: #008000"> string = 'hello'
string = <span style="color: #800000">'''<span style="color: #800000">
hello
=<span style="color: #0000ff">if<span style="color: #000000"> s:
<span style="color: #0000ff">print(s.group())
-
字符转义
- 若匹配正则语法中的特定字符都需要进行转义
- 正则字符串会被处理两次,python中处理一次,re模块会在处理一次
- 若不想考虑字符的转义问题,可以在书写正则字符串时前面加一个字符'r'
- 添加'r'之后,在python不会再进行任何转义,只需在与正则语法相关的字符前加''即可让其使用原有意义
-
相关函数:
- match:从开头进行匹配,匹配到就返回正则结果对象,没有就返回None
- search:从任意位置匹配,匹配到一次就返回,没有就返回None
<span style="color: #008000">#<span style="color: #008000"> 只从开头匹配,找到返回一个正则结果对象,没有找到返回None<span style="color: #008000"><span style="color: #008000"> m = re.match('abc','abcsdhasdasjabcweuqo')<span style="color: #008000">
<span style="color: #008000"> 全部匹配,只要找到就停止并返回
m = re.search(<span style="color: #800000">'<span style="color: #800000">abc<span style="color: #800000">',<span style="color: #800000">'<span style="color: #800000">sdhabcsdasjabcweuqo<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">if<span style="color: #000000"> m:
<span style="color: #008000">#<span style="color: #008000"> 提取匹配到的内容
<span style="color: #0000ff">print<span style="color: #000000">(m.group())
<span style="color: #008000">#<span style="color: #008000"> 获取匹配位置
<span style="color: #0000ff">print(m.span())- findall:全局匹配,返回匹配到的结果列表,没有时返回空列表
内容,返回匹配结果组成的列表,若没有则返回空列表 f = re.findall(,(type(f))- compile:生成正则表达式对象
生成正则表达式对象,用于正则匹配 c = re.compile(<span style="color: #008000">#<span style="color: #008000"> 从开头进行匹配<span style="color: #008000"> <span style="color: #008000"> m = c.match('hellosdsjldkabc')<span style="color: #008000"><span style="color: #008000"> 从任意位置匹配
m = c.search(<span style="color: #800000">'<span style="color: #800000">shdjkhelloaskjdha<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">if<span style="color: #000000"> m:
<span style="color: #0000ff">print<span style="color: #000000">(m.group())
<span style="color: #008000">#<span style="color: #008000"> 匹配所有
f = c.findall(<span style="color: #800000">'<span style="color: #800000">helloasjdhakhello<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">if<span style="color: #000000"> f:
<span style="color: #0000ff">print(f)将正则的匹配分两步完成:先创建正则对象,然后通过对象的match、search、findall方法完成匹配
说明:正则的解析处理是由re
模块完成
单个字符:
-z]:a~-9]:0~-Z0-9^-9^0-9中文)、下划线等(就是字)
\W:所有的非字字符(\w的取反)
\s:所有的空白字符(\n、\t、\t、空格等)
\S:所有的非空白字符
\b:词边界匹配(开头、结尾、标点、空格)
\B:非词边界匹配
-
次数控制
<pre data-source-line="94"><code class="hljs"><span class="xml">
正则的匹配默认都是贪婪的(最大限度的匹配)
-
边界限定
<span style="color: #008000">#<span style="color: #008000"> 以指定的内容开头<span style="color: #008000">
<span style="color: #008000"> c = re.compile(r'^abc')<span style="color: #008000">
<span style="color: #008000"> 以指定的内容结尾
c = re.compile(r<span style="color: #800000">'<span style="color: #800000">kas$<span style="color: #800000">'<span style="color: #000000">)
s = c.search(<span style="color: #800000">'<span style="color: #800000">abcsdhkas<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">if<span style="color: #000000"> s:
<span style="color: #0000ff">print(s.group())
-
优先级控制
- |:表示或,它拥有最低的优先级
- ():用于表示一个整体,明确的指定优先级
- 示例:
c = re.compile(r<span style="color: #800000">'<span style="color: #800000">a(hello|world)b<span style="color: #800000">'<span style="color: #000000">)
s = c.search(<span style="color: #800000">'<span style="color: #800000">aworldb<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">if<span style="color: #000000"> s:
<span style="color: #0000ff">print(s.group())
-
分组匹配
- 说明:()不但可以作为一个整体,还可以进行分组匹配
- 示例1:
c = re.compile(r<span style="color: #800000">'<span style="color: #800000">(\d+)([a-z]+)(\d+)<span style="color: #800000">'<span style="color: #000000">)
s = c.search(<span style="color: #800000">'<span style="color: #800000">shd327sjahdajhsd87892ehawksd<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">if<span style="color: #000000"> s:
<span style="color: #0000ff">print<span style="color: #000000">(s.group())
<span style="color: #008000">#<span style="color: #008000"> 默认就是全部的匹配内容,等价于上式
<span style="color: #0000ff">print<span style="color: #000000">(s.group(0))
<span style="color: #008000">#<span style="color: #008000"> 第一个()匹配到的内容
<span style="color: #0000ff">print(s.group(1<span style="color: #000000">))
<span style="color: #0000ff">print(s.group(2<span style="color: #000000">))
<span style="color: #0000ff">print(s.group(3<span style="color: #000000">))
<span style="color: #0000ff">print<span style="color: #000000">(s.span())
<span style="color: #0000ff">print<span style="color: #000000">(s.span(0))
<span style="color: #0000ff">print(s.span(1<span style="color: #000000">))
<span style="color: #0000ff">print(s.span(2<span style="color: #000000">))
<span style="color: #0000ff">print(s.span(3))
- 示例2:给分组起名字
<span style="color: #008000">#<span style="color: #008000"> 固定匹配<span style="color: #008000">
<span style="color: #008000"> c = re.compile(r'')<span style="color: #008000">
<span style="color: #008000"> \1表示前面第一个小括号匹配的内容<span style="color: #008000">
<span style="color: #008000"> c = re.compile(r'<([a-z]+)><([a-z]+)>\w+</\2></\1>')<span style="color: #008000">
<span style="color: #008000"> 给()起名字
c = re.compile(r<span style="color: #800000">'<span style="color: #800000"><(?P[a-z]+)><(?P[a-z]+)>\w+</(?P=ergou)></(?P=goudan)><span style="color: #800000">'<span style="color: #000000">)
s = c.search(<span style="color: #800000">'<span style="color: #800000">
<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">if<span style="color: #000000"> s:
<span style="color: #0000ff">print(s.group())
-
贪婪匹配
- 贪婪:最大限度的匹配叫贪婪。正则的匹配默认是贪婪。
- 非贪婪:只要满足匹配条件,能少匹配就少匹配;通过可以使用'?'进行取消贪婪
- 示例:
<span style="color: #008000">#<span style="color: #008000"> 取消任意多次的贪婪<span style="color: #008000">
<span style="color: #008000"> c = re.compile(r'a.*?b')<span style="color: #008000">
<span style="color: #008000"> 取消至少一次的贪婪
c = re.compile(r<span style="color: #800000">'<span style="color: #800000">a.+?b<span style="color: #800000">'<span style="color: #000000">)
s = c.search(<span style="color: #800000">'<span style="color: #800000">abdhsadjbsdjabs<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">if<span style="color: #000000"> s:
<span style="color: #0000ff">print(s.group())
-
匹配模式
- 说明:所谓模式就是对匹配的原则进行整体的修饰
- 示例:
<span style="color: #008000">#<span style="color: #008000"> 忽略大小写的匹配<span style="color: #008000">
<span style="color: #008000"> c = re.compile(r'hello',re.I)<span style="color: #008000">
<span style="color: #008000"> s = c.search('Hello world')
<span style="color: #008000">#<span style="color: #008000"> 进行多行匹配,默认单行匹配<span style="color: #008000">
<span style="color: #008000"> c = re.compile(r'^hello',re.M)<span style="color: #008000">
<span style="color: #008000"> s = c.search('world \nhello')
<span style="color: #008000">#<span style="color: #008000"> 做为单行处理 或 让 . 能够匹配 \n
c = re.compile(r<span style="color: #800000">'<span style="color: #800000">
.*?<span style="color: #800000">'<span style="color: #000000">,re.S)
<span style="color: #008000">#<span style="color: #008000"> string = 'hello'
string = <span style="color: #800000">'''<span style="color: #800000">
hello
=<span style="color: #0000ff">if<span style="color: #000000"> s:
<span style="color: #0000ff">print(s.group())
-
字符转义
- 若匹配正则语法中的特定字符都需要进行转义
- 正则字符串会被处理两次,python中处理一次,re模块会在处理一次
- 若不想考虑字符的转义问题,可以在书写正则字符串时前面加一个字符'r'
- 添加'r'之后,在python不会再进行任何转义,只需在与正则语法相关的字符前加''即可让其使用原有意义
单个字符:
次数控制
<pre data-source-line="94"><code class="hljs"><span class="xml">
正则的匹配默认都是贪婪的(最大限度的匹配)
边界限定
<span style="color: #008000"> c = re.compile(r'^abc')<span style="color: #008000">
<span style="color: #008000"> 以指定的内容结尾
c = re.compile(r<span style="color: #800000">'<span style="color: #800000">kas$<span style="color: #800000">'<span style="color: #000000">)
s = c.search(<span style="color: #800000">'<span style="color: #800000">abcsdhkas<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">if<span style="color: #000000"> s:
<span style="color: #0000ff">print(s.group())
优先级控制
- |:表示或,它拥有最低的优先级
- ():用于表示一个整体,明确的指定优先级
- 示例:
s = c.search(<span style="color: #800000">'<span style="color: #800000">aworldb<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">if<span style="color: #000000"> s:
<span style="color: #0000ff">print(s.group())
分组匹配
- 说明:()不但可以作为一个整体,还可以进行分组匹配
- 示例1:
s = c.search(<span style="color: #800000">'<span style="color: #800000">shd327sjahdajhsd87892ehawksd<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">if<span style="color: #000000"> s:
<span style="color: #0000ff">print<span style="color: #000000">(s.group())
<span style="color: #008000">#<span style="color: #008000"> 默认就是全部的匹配内容,等价于上式
<span style="color: #0000ff">print<span style="color: #000000">(s.group(0))
<span style="color: #008000">#<span style="color: #008000"> 第一个()匹配到的内容
<span style="color: #0000ff">print(s.group(1<span style="color: #000000">))
<span style="color: #0000ff">print(s.group(2<span style="color: #000000">))
<span style="color: #0000ff">print(s.group(3<span style="color: #000000">))
<span style="color: #0000ff">print<span style="color: #000000">(s.span())
<span style="color: #0000ff">print<span style="color: #000000">(s.span(0))
<span style="color: #0000ff">print(s.span(1<span style="color: #000000">))
<span style="color: #0000ff">print(s.span(2<span style="color: #000000">))
<span style="color: #0000ff">print(s.span(3))
- 示例2:给分组起名字
<span style="color: #008000"> c = re.compile(r'')<span style="color: #008000">
<span style="color: #008000"> \1表示前面第一个小括号匹配的内容<span style="color: #008000">
<span style="color: #008000"> c = re.compile(r'<([a-z]+)><([a-z]+)>\w+</\2></\1>')<span style="color: #008000">
<span style="color: #008000"> 给()起名字
c = re.compile(r<span style="color: #800000">'<span style="color: #800000"><(?P
s = c.search(<span style="color: #800000">'<span style="color: #800000">
<span style="color: #800000">'<span style="color: #000000">)<span style="color: #0000ff">if<span style="color: #000000"> s:
<span style="color: #0000ff">print(s.group())
贪婪匹配
- 贪婪:最大限度的匹配叫贪婪。正则的匹配默认是贪婪。
- 非贪婪:只要满足匹配条件,能少匹配就少匹配;通过可以使用'?'进行取消贪婪
- 示例:
<span style="color: #008000"> c = re.compile(r'a.*?b')<span style="color: #008000">
<span style="color: #008000"> 取消至少一次的贪婪
c = re.compile(r<span style="color: #800000">'<span style="color: #800000">a.+?b<span style="color: #800000">'<span style="color: #000000">)
s = c.search(<span style="color: #800000">'<span style="color: #800000">abdhsadjbsdjabs<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">if<span style="color: #000000"> s:
<span style="color: #0000ff">print(s.group())
匹配模式
- 说明:所谓模式就是对匹配的原则进行整体的修饰
- 示例:
<span style="color: #008000"> c = re.compile(r'hello',re.I)<span style="color: #008000">
<span style="color: #008000"> s = c.search('Hello world')
<span style="color: #008000">#<span style="color: #008000"> 进行多行匹配,默认单行匹配<span style="color: #008000">
<span style="color: #008000"> c = re.compile(r'^hello',re.M)<span style="color: #008000">
<span style="color: #008000"> s = c.search('world \nhello')
<span style="color: #008000">#<span style="color: #008000"> 做为单行处理 或 让 . 能够匹配 \n
c = re.compile(r<span style="color: #800000">'<span style="color: #800000">
<span style="color: #008000">#<span style="color: #008000"> string = '
string = <span style="color: #800000">'''<span style="color: #800000">
hello
<span style="color: #0000ff">print(s.group())
字符转义
- 若匹配正则语法中的特定字符都需要进行转义
- 正则字符串会被处理两次,python中处理一次,re模块会在处理一次
- 若不想考虑字符的转义问题,可以在书写正则字符串时前面加一个字符'r'
- 添加'r'之后,在python不会再进行任何转义,只需在与正则语法相关的字符前加''即可让其使用原有意义