前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >正则表达式

正则表达式

作者头像
星哥玩云
发布2022-09-08 14:01:29
2130
发布2022-09-08 14:01:29
举报
文章被收录于专栏:开源部署

一、正则基础

1、为什么使用正则

需求

判断一个字符串是否是手机号

解决

编写一个函数,给函数一个字符串,如果是手机号则返回True,否则返回False

代码

代码语言:javascript
复制
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">isPhone</span><span class="hljs-params">(phone)</span>:</span>
    <span class="hljs-comment"># 长度为11</span>
    <span class="hljs-comment"># 全部都是数字字符</span>
    <span class="hljs-comment"># 以1开头</span>
    <span class="hljs-keyword">pass</span>

<span class="hljs-keyword">if</span> isPhone(<span class="hljs-string">"13812345678"</span>):
    print(<span class="hljs-string">"是手机号"</span>)
<span class="hljs-keyword">else</span>:
    print(<span class="hljs-string">"不是手机号"</span>)

注意

如果使用正则会让这个问题变得简单

2、re模块简介

python自1.5版本开始增加了re模块,该模块提供了perl风格的正则表达式模式,re模块是python语言拥有了所有正则表达式的功能

  • 如下四个方法经常使用
    • match()
    • search()
    • findall()
    • finditer()

二、re模块中常用函数

1、match()函数

原型

代码语言:javascript
复制
def match(pattern, string, flags=0)

功能

尝试从字符串string的起始位置匹配一个pattern模式,如果不在起始位置匹配成功的话就返回None

参数

参数

说明

pattern

匹配的正则表达式(一种字符串的模式)

string

要匹配的字符串

flags

标识位,用于控制正则表达式的匹配方式

flags

说明

re.I

是匹配对大小写不敏感

re.L

做本地化识别匹配

re.M

多行匹配,影响到^和$

re.S

使.匹配包括换行符在内的所有字符

re.U

根据Unicode字符集解析字符,影响\w、\W、\b、\B

re.X

通过给予我们功能灵活的格式以便更好的理解正则表达式

代码

代码语言:javascript
复制
<span class="hljs-keyword">import</span> re

ret = re.match(<span class="hljs-string">"www"</span>,<span class="hljs-string">"www.zutuanxue_com.wang"</span>)
print(ret, type(ret), ret.span())
print(re.match(<span class="hljs-string">"www"</span>,<span class="hljs-string">"wwW.zutuanxue_com.www.wang"</span>, re.I))
print(re.match(<span class="hljs-string">"www"</span>,<span class="hljs-string">"zutuanxue_com.www.wang"</span>))
print(re.match(<span class="hljs-string">"www"</span>,<span class="hljs-string">"zutuanxue_com.wang"</span>))

2、searce()函数

原型

代码语言:javascript
复制
def search(pattern, string, flags=0)

功能

扫描整个字符串string,并返回第一个pattern模式成功的匹配

参数

参数

说明

pattern

匹配的正则表达式(一种字符串的模式)

string

要匹配的字符串

flags

标识位,用于控制正则表达式的匹配方式

flags

说明

re.I

是匹配对大小写不敏感

re.L

做本地化识别匹配

re.M

多行匹配,影响到^和$

re.S

使.匹配包括换行符在内的所有字符

re.U

根据Unicode字符集解析字符,影响\w、\W、\b、\B

re.X

通过给予我们功能灵活的格式以便更好的理解正则表达式

代码

代码语言:javascript
复制
<span class="hljs-keyword">import</span> re

ret = re.search(<span class="hljs-string">"www"</span>, <span class="hljs-string">"zutuanxue_com.www.wang.www"</span>)
print(ret, type(ret), ret.span())

3、findall()函数

原型

代码语言:javascript
复制
def findall(pattern, string, flags=0)

功能

扫描整个字符串string,并返回所有匹配的pattern模式结果的字符串列表

参数

参数

说明

pattern

匹配的正则表达式(一种字符串的模式)

string

要匹配的字符串

flags

标识位,用于控制正则表达式的匹配方式

flags

说明

re.I

是匹配对大小写不敏感

re.L

做本地化识别匹配

re.M

多行匹配,影响到^和$

re.S

使.匹配包括换行符在内的所有字符

re.U

根据Unicode字符集解析字符,影响\w、\W、\b、\B

re.X

通过给予我们功能灵活的格式以便更好的理解正则表达式

代码

代码语言:javascript
复制
<span class="hljs-keyword">import</span> re

ret = re.findall(<span class="hljs-string">"www"</span>, <span class="hljs-string">"zutuanxue_com.www.wang.wwwqqww1fffwwe"</span>)
print(ret, type(ret))

<span class="hljs-comment"># ww1 ww2 ww3 ww4 wwa wwb wwc ww@</span>
print(re.findall(<span class="hljs-string">""</span>, <span class="hljs-string">"zutuanxue_com.www.wang.wwwqqww1fffwwe"</span>))

4、finditer()函数

原型

代码语言:javascript
复制
def finditer(pattern, string, flags=0)

功能

与findall()类似,返回一个迭代器

参数

参数

说明

pattern

匹配的正则表达式(一种字符串的模式)

string

要匹配的字符串

flags

标识位,用于控制正则表达式的匹配方式

flags

说明

re.I

是匹配对大小写不敏感

re.L

做本地化识别匹配

re.M

多行匹配,影响到^和$

re.S

使.匹配包括换行符在内的所有字符

re.U

根据Unicode字符集解析字符,影响\w、\W、\b、\B

re.X

通过给予我们功能灵活的格式以便更好的理解正则表达式

代码

代码语言:javascript
复制
<span class="hljs-keyword">import</span> re

ret = re.finditer(<span class="hljs-string">"www"</span>, <span class="hljs-string">"zutuanxue_com.www.wang.wwwqqww1fffwwe"</span>)
print(ret, type(ret))
<span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> ret:
    print(x, type(x), x.span())

三、正则表达式元字符

1、匹配单个字符与数字

匹配

说明

.

匹配除换行符以外的任意字符,当flags被设置为re.S时,可以匹配包含换行符以内的所有字符,如果没有设置并且还匹配所有字符需要[.\n]

[]

里面是字符集合,匹配[]里任意一个字符

[0123456789]

匹配任意一个数字字符

[0-9]

匹配任意一个数字字符

[a-z]

匹配任意一个小写英文字母字符

[A-Z]

匹配任意一个大写英文字母字符

[A-Za-z]

匹配任意一个英文字母字符

[A-Za-z0-9]

匹配任意一个数字或英文字母字符

[^zutuanxue_com]

[]里的^称为脱字符,表示非,匹配不在[]内的任意一个字符

\d

匹配任意一个数字字符,相当于[0-9]

\D

匹配任意一个非数字字符,相当于[^0-9]

\w

匹配字母、下划线、数字中的任意一个字符,相当于[0-9A-Za-z_]

\W

匹配非字母、下划线、数字中的任意一个字符,相当于[^0-9A-Za-z_]

\s

匹配空白符(空格、换页、换行、回车、制表),相当于[ \f\n\r\t]

\S

匹配非空白符(空格、换页、换行、回车、制表),相当于[^ \f\n\r\t]

代码语言:javascript
复制
impor re

print(re.findall(<span class="hljs-string">r"ww\d"</span>, <span class="hljs-string">"zutuanxue_com.www.wang.wwwqqww1fww\nffwweeeww3"</span>))
print(re.findall(<span class="hljs-string">r"ww."</span>, <span class="hljs-string">"zutuanxue_com.www.wang.wwwqqww1fww\nffwwe"</span>, re.S))

2、匹配锚字符

匹配

说明

^

行首匹配,和[]里的^不是一个意思

$

行尾匹配

代码语言:javascript
复制
<span class="hljs-keyword">import</span> re

print(re.search(<span class="hljs-string">r"^zutuanxue_com"</span>,<span class="hljs-string">"zutuanxue_com is a good man"</span>))
print(re.search(<span class="hljs-string">r"^zutuanxue_com"</span>,<span class="hljs-string">"a zutuanxue_com is a good man"</span>))
print(re.search(<span class="hljs-string">r"man$"</span>,<span class="hljs-string">"zutuanxue_com is a good man"</span>))
print(re.search(<span class="hljs-string">r"^man$"</span>,<span class="hljs-string">"man"</span>))
s = <span class="hljs-string">'''zutuanxue_com is a good man
zutuanxue_com is a nice man
zutuanxue_com is a cool man
kaige is a good man
zutuanxue_com is a handsome man
'''</span>
print(<span class="hljs-string">"-----------------------"</span>)
ret = re.finditer(<span class="hljs-string">r"^zutuanxue_com"</span>, s, re.M)
<span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> ret:
    print(x)

3、匹配边界字符

匹配

说明

\A

匹配字符串的开始,和^的区别是\A只匹配整个字符串的开头,即使在re.M模式下也不会匹配其他行的行首

\Z

匹配字符串的结尾,和$的区别是\Z只匹配整个字符串的结尾,即使在re.M模式下也不会匹配其他行的行尾

\b

匹配一个单词的边界,指单词和空格的位置

\B

匹配非单词边界

代码语言:javascript
复制
<span class="hljs-keyword">import</span> re

print(re.findall(<span class="hljs-string">r"\Azutuanxue_com"</span>, s, re.M))
print(re.findall(<span class="hljs-string">r"ck\b"</span>, <span class="hljs-string">"zutuanxue_com is a good man! ack is a nice mack,nckab"</span>))
ret = re.finditer(<span class="hljs-string">r"ck\B"</span>, <span class="hljs-string">"zutuanxue_com is a good man! ack is a nice manckab"</span>)
<span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> ret:
    print(x)

4、匹配多个字符

说明:以下使用x、y、z均为假设的普通字符,m、n表示一个数字,不是正则表达式的元字符

匹配

说明

(xyz)

匹配括号内的xyz,作为一个整体去匹配

x?

匹配0个或者1个x,非贪婪匹配

x*

匹配0个或任意多个x

x+

匹配至少一个x

x{n}

确定匹配n个x,n是非负数

x{n,}

至少匹配n个x

x{n,m}

匹配至少n个最多m个x

x|y

|表示或的意思,匹配x或y

代码语言:javascript
复制
<span class="hljs-keyword">import</span> re

print(re.findall(<span class="hljs-string">r"(very)"</span>, <span class="hljs-string">"zutuanxue_com is a very very good man"</span>))
print(re.findall(<span class="hljs-string">r"a?"</span>, <span class="hljs-string">"11111a2222aa3333aaa44444aaaa55555"</span>))
print(re.findall(<span class="hljs-string">r"a*"</span>, <span class="hljs-string">"11111a2222aa3333aaa44444aaaa55555"</span>))
print(re.findall(<span class="hljs-string">r"a+"</span>, <span class="hljs-string">"11111a2222aa3333aaa44444aaaa55555"</span>))
print(re.findall(<span class="hljs-string">r"a{2}"</span>, <span class="hljs-string">"11111a2222aa3333aaa44444aaaa55555"</span>))
print(re.findall(<span class="hljs-string">r"a{3,}"</span>, <span class="hljs-string">"11111a2222aa3333aaa44444aaaa55555"</span>))
print(re.findall(<span class="hljs-string">r"a{3,5}"</span>, <span class="hljs-string">"11111a2222aa3333aaa44444aaaa55555aaaaa666aaaaaa"</span>))
print(re.findall(<span class="hljs-string">r"((s|S)unck)"</span>, <span class="hljs-string">"zutuanxue_com is a good manzutuanxue_com"</span>))
print(re.findall(<span class="hljs-string">r"(zutuanxue_com|zutuanxue_com)"</span>, <span class="hljs-string">"zutuanxue_com is a good manzutuanxue_com"</span>))
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、正则基础
    • 1、为什么使用正则
      • 2、re模块简介
      • 二、re模块中常用函数
        • 1、match()函数
          • 2、searce()函数
            • 3、findall()函数
              • 4、finditer()函数
              • 三、正则表达式元字符
                • 1、匹配单个字符与数字
                  • 2、匹配锚字符
                    • 3、匹配边界字符
                      • 4、匹配多个字符
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档