Python标准库re的使用举例(正则化匹配)

目录
  • 常用正则表达式
  • 一,必备知识
    • 1.修饰符(flag)
    • 2.匹配模式
    • 3. r的作用
    • 4. 贪婪与非贪婪—通配符后面加?
    • 5.转义匹配的使用
    • 6. group(num = 0)和groups( )
  • 二,函数应用
    • 1. re.compile(pattern,flags=0)—自定义匹配模板
    • 2. re.match(pattern,string,flags=0)—从第一个字符开始匹配
    • 3. re.search(pattern,string,flags=0)—不固定开始,但是只匹配第一个
    • 4. re.findall(pattern, string,[, flags])—匹配所有数据
    • 5. finditer(pattern, string,[,flags] )—返回的是匹配到的迭代器对象
    • 6. split(pattern, string, max = 0)
    • 7. re.sub(pattern, repl, string, count=0, flags=0)—可正则的字符串替换
    • 8. str.replace(old, new,max)—不是re函数,仅用作字符串替换
  • 总结

常用正则表达式

正则表达式                                                              描述                                    匹配结果
\d+(\.\d*)?                                                       任意整数和浮点数                            0.004 2 75.

\b[^\Wa-z0-9_][^\WA-Z0-9_]*\b                                      首字母只能大写                               Boo Foo

^http:\/\/([\w-]+(\.[\w-]+)+(\/[\w-.\/\?%&=\u4e00-\u9fa5]*)?)?$      验证网址                           http://www.baidu.com/?id=1

^[\u4e00-\u9fa5]{0,}$                                                验证汉字                                 汉字汉字

\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*                       验证电子邮件                             example@163.com

^[1-9]([0-9]{16}|[0-9]{13})[xX0-9]$                                 验证身份证                            14525419951215445X

^13[0-9]{1}[0-9]{8}|^15[9]{1}[0-9]{8}                               验证手机号                             138459572***

^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])          验证IP                             192.168.1.1
\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)
\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)
\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$	

^[a-zA-Z0-9]+([a-zA-Z0-9\-\.]+)?\.s|)$                                验证域名                                baidu.com

^([a-zA-Z]\:|\\)\\([^\\]+\\)*[^\/:*?"<>|]+\.txt(l)?$               验证文件路径	                             C:\user\wo

<(.*)>(.*)<\/(.*)>|<(.*)\/>                                        HTML标签匹配(需修改)                          xxxx

一,必备知识

1.修饰符(flag)

re.I  使匹配对大小写不敏感
re.L  做本地化识别匹配
re.M  多行匹配,影响^和$
re.S  使.匹配包括换行在内的所有字符
re.U  根据Unicode字符集解析字符.这个标志影响\w \W \b \B
re.X  该标志通过给予你更灵活的格式以便你将正则表达式写的更易于理解.

# 例子 result = re.match('^The.*?(\d+).*?phone.', content, re.S)

2.匹配模式

^          匹配字符串开头
$          匹配字符串结尾
.          匹配人以字符,除了换行符号.当re.DOTAALL标记被指定时,则可以匹配包括换行符的任意字符.
[...]      用来表示一组字符,单独列出:[amk]匹配a,m或k
[^...]     不在[]中的字符:[^amk]匹配除amk之外的字符
re*        匹配0个或多个的表达式
re+        匹配1个或多个的表达式
re?        匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式.
re{n}      精准匹配n个前面表达式
re{n,}     匹配大于等于n个前面表达式
re{n,m}    匹配n到m个前面的表达式定义的片段,贪婪方式
a|b        匹配a或b
(re)       对正则表达式分组,并记住匹配的文本
(?imx)     正则表达式包含三种可选标志,imx,只影响括号中的区域.
(?-imx)    正则表达式关闭imx可选标志,只影响括号中的区域.
(?:re)     类似(...)但不表示一个组
(?imx:re)  在括号中使用imx可选标志
(?-imx:re) 在括号中不是用imx可选标志
(?#...)    注释
(?=re)     前向肯定界定符.如果所含正则表达式,以...表示,在当前位置成功匹配时成功,否则失败.但一旦所含表达式已经尝试,匹配引擎根本没有提高,模式的剩余部分还要尝试界定符右边.
(?!re)     前向否定界定符.与肯定界定符相反;当所含的表达式不能在字符串当前位置匹配成功时成功.
(?>re)     匹配的独立模式,省去回朔.
\w         匹配字符数字以及下划线
\W         匹配非字母数字下划线
\s         匹配任意空白字符,等价于[\t\n\r\f]
\S         匹配任意非空白字符
\d         匹配任意数字
\D         匹配任意非数字
\A         匹配字符串开始
\Z         匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串.
\z         匹配字符串结束
\G         匹配最后匹配完成的位置
\b         匹配一个单词边界,也就是指单词和空格之间的位置
\B         匹配非单词边界
\n \t      匹配一个换行符,一个制表符
\1...\9    匹配第n个分组的内容

3. r的作用

  • r’(\w+) (\w+)(?P.*)’,字符串之前的r可以避免转行符混淆

正则表达式使用反斜杠来表示特殊形式,或者把特殊字符转义成普通字符

反斜杠在普通的 Python 字符串里也有相同的作用,所以就产生了冲突

解决办法是对于正则表达式样式使用 Python 的原始字符串表示法;在带有 ‘r’ 前缀的字符串字面值中,反斜杠不必做任何特殊处理

import re

if re.search(r'\\d', 'I have one nee\dle') is not None:
    print('match it',re.search(r'\\d', 'I have one nee\dle').group(0))
else:
    print('not match')

# match it \d

4. 贪婪与非贪婪—通配符后面加?

在贪婪匹配下,.* 会匹配尽可能多的字符

正则表达式中.*后面是\d+,也就是至少一个数字,并没有指定具体多少个数字,因此,.*就尽可能匹配多的字符,这里就把12345匹配了,给\d+留下个可满 足条件的数字 6.最后得到的内容就只有数字6了

import re

content = 'The 123456 is my one phone number.'
print('贪婪匹配:')
result = re.match(r'^The.*(\d+).*', content) #使用match匹配, 第一个参数为正则表达式, 第二个为要匹配的字符串
print(result.group()) #输出匹配内容
print('result = %s'%result.group(1)) #输出第一个被()包裹的内容

print('-'*20)

print('非贪婪匹配:')
result = re.match(r'^The.*?(\d+).*', content)
print(result.group())
print('result = %s'%result.group(1))

# 贪婪匹配:
# The 123456 is my one phone number.
# result = 6
# --------------------
# 非贪婪匹配:
# The 123456 is my one phone number.
# result = 123456

5.转义匹配的使用

由于()属于正则表达式的特殊字符, 因此在需要匹配()时, 需要加上转义字符\.

import re

content = '(百度)www.baidu.com'
result = re.match('(百度)www.baidu.com', content)
result2 = re.match('\(百度\)www\.baidu\.com', content)
if result:
    print(result.group())
else:
    print('result = None')
if result2:
    print(result2.group())
else:
    print('result2 = None')

# result = None
# (百度)www.baidu.com

6. group(num = 0)和groups( )

  • group 函数有一个int类型的参数,参数为0表示返回正则匹配的字符串,参数为1返回正则中第一个组匹配的内容,2返回第二组的内容一次类推
  • groups 函数是所有group函数结果组成一个元组。

二,函数应用

1. re.compile(pattern,flags=0)—自定义匹配模板

  • 他的第一个参数是正则字符串,第二个参数是修饰符
  • 编译成一个正则表达式对象,可以用于匹配match/search/findall 方法 序列
  • 在需要匹配相同正则表达式情况下, 事先定义一个compile可以简化代码量, 同时compile中也可以使用修饰符r.S等.
import re

content1 = '2016-1-1 12:01'
content2 = '2017-1-1 12:02'
content3 = '2018-1-1 12:03'

pattern = re.compile('\d{2}:\d{2}')
result1 = re.sub(pattern, '', content1)
result2 = re.sub(pattern, '', content2)
result3 = re.sub(pattern, '', content3)
print(result1, result2, result3)

#2016-1-1  2017-1-1  2018-1-1

2. re.match(pattern,string,flags=0)—从第一个字符开始匹配

  • 该函数从第一个字符开始匹配,如果第一个对不上,就不可能匹配到数据

  • 从第一个字符开始进行匹配,不成功则返回None。
  • 一个正则表达式中若有多个()可用group方法输出,比如:ex_re=re.match(‘(.?)actor(.?)$’),可用ex_re.group()访问生成的列表,可用ex_re.group(0)访问第一个括号里的元素。
  • pettern 就是正则字符串,如果是通过re.compile方法生成的正则对象.match来调用的话,就不需要这个参数了,因为正则对象本身就代表了一个正则匹配模式。
  • string 就是要进行匹配的目标字符串
  • flags 就是正则的修饰符,比如 re.I
import re
regex = '(foo\w)(\w)'
m = re.match(r'(foo\w)(\w)','fooasdfooasd')
if m is not None:
    print(m.group(1))
    print(m.groups())

#输出
#fooa
#('fooa', 's')

3. re.search(pattern,string,flags=0)—不固定开始,但是只匹配第一个

  • re.search()并不要求必须从字符串的开头进行匹配如match(),也就是说,正则表达式可以是字符串的一部分。
  • 用法基本与match相同,只不过是扫描整个字符串,从一开始匹配到的地方开始。
import re
regex = '<(.*)>(.*)<\/(.*)>|<(.*)\/>'
m = re.search(regex,"aa<a>aaaa</a>")
#一样只有search能匹配到标签
if m is not None:
    print(m)
    print(m.group())

# 结果
# <re.Match object; span=(2, 13), match='<a>aaaa</a>'>
# <a>aaaa</a>

4. re.findall(pattern, string,[, flags])—匹配所有数据

  • match()和search()都是返回匹配到的第一个内容就结束匹配, findall()是返回所有符合匹配规则的内容
  • 搜索字符串内,以列表形式返回全部能匹配的子串。
import re
text = "I am so happy! "
array1 = re.findall("[a-zA-Z]", text)
array2 = re.findall("[a-zA-Z]+", text)
print(array1)
print(array2)

#结果
# ['I', 'a', 'm', 's', 'o', 'h', 'a', 'p', 'p', 'y']
# ['I', 'am', 'so', 'happy']

5. finditer(pattern, string,[,flags] )—返回的是匹配到的迭代器对象

与findall()相同,但返回的是一个迭代器。对于每一次匹配,迭代器都能返回一个匹配对象

import re
regex = 'apple'
m = [ g.group() for g in re.finditer(regex,'apple1 apple2 apple3')]
print(m)
#输出
#['apple', 'apple', 'apple']

6. split(pattern, string, max = 0)

根据正则表达式的模式分隔符,split函数将字符串分割为列表,返回匹配列表,分割最多操作max次

import re
list = [
'aaa,bbb,ccc',
'ddd,eee,fff',
]
for i in list:
    print(re.split(',',i))

# ['aaa', 'bbb', 'ccc']
# ['ddd', 'eee', 'fff']

7. re.sub(pattern, repl, string, count=0, flags=0)—可正则的字符串替换

替换字符串中的某些子串,可以用正则表达式来匹配被选子串。

pattern:表示正则表达式中的模式字符串;

repl:被替换的字符串(既可以是字符串,也可以是函数);

string:要被处理的,要被替换的字符串;

count:匹配的次数, 默认是全部替换

import re
st = "hello 2019"
st = re.sub("([0-9]+)","yudengwu",st)
print(st)

#结果
# hello yudengwu

8. str.replace(old, new,max)—不是re函数,仅用作字符串替换

  • 替代字符串中的某一些子串为另一些字符。
  • old – 将被替换的子字符串。
  • new – 新字符串,用于替换old子字符串。
  • max – 可选字符串, 替换不超过 max 次
import re
st = "我喜欢你,喜欢你"
st = st.replace("喜欢","爱",1)
print(st)

# 我爱你,喜欢你

总结

到此这篇关于Python标准库re的使用举例的文章就介绍到这了,更多相关Python标准库re使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 比较详细Python正则表达式操作指南(re使用)

    就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.使用这个小型语言,你可以为想要匹配的相应字符串集指定规则:该字符串集可能包含英文语句.e-mail地址.TeX命令或任何你想搞定的东西.然後你可以问诸如"这个字符串匹配该模式吗?"或"在这个字符串中是否有部分匹配该模式呢?".你也可以使用 RE 以各种方式来修改或分割字符串. 正则表达式模式被编译成一系列的字节码,然後由用 C

  • python的正则表达式re模块的常用方法

    1.re的简介 使用python的re模块,尽管不能满足所有复杂的匹配情况,但足够在绝大多数情况下能够有效地实现对复杂字符串的分析并提取出相关信息.python 会将正则表达式转化为字节码,利用 C 语言的匹配引擎进行深度优先的匹配. 复制代码 代码如下: import re print re.__doc__ 可以查询re模块的功能信息,下面会结合几个例子说明. 2.re的正则表达式语法 正则表达式语法表如下: 语法 意义 说明 "." 任意字符 "^" 字符串开始

  • python正则表达式re模块详细介绍

    本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以是Unicode字符,这点不用担心,python会处理地和Ascii字符一样漂亮. 正则表达式使用反斜杆(\)来转义特殊字符,使其可以匹配字符本身,而不是指定其他特殊的含义.这可能会和python字面意义上的字符串转义相冲突,这也许有些令人费解.比如,要匹配一个反斜杆本身,你也许要用'\\\\'来做为正则表达式的字符串,因为正则表达式要是\\,而字符串里,每个反斜杆都要写成\\. 你也可以在字符串前加上

  • Python之re模块详解

    目录 Python--re模块 简介 预定义字符 特殊字符 反斜杠问题 匹配方法 总结 Python--re模块 简介 定义:re模块称为正则表达式: 作用:创建一个"规则表达式",用于验证和查找符合规则的文本,广泛用于各种搜索引擎.账户密码的验证等: 预定义字符 """ \d 匹配所有的十进制数字 0-9 \D 匹配所有的非数字,包含下划线 \s 匹配所有空白字符(空格.TAB等) \S 匹配所有非空白字符,包含下划线 \w 匹配所有字母.汉字.数字 a

  • Python使用re模块正则提取字符串中括号内的内容示例

    本文实例讲述了Python使用re模块正则提取字符串中括号内的内容操作.分享给大家供大家参考,具体如下: 直接上代码吧: # -*- coding:utf-8 -*- #! python2 import re string = 'abe(ac)ad)' p1 = re.compile(r'[(](.*?)[)]', re.S) #最小匹配 p2 = re.compile(r'[(](.*)[)]', re.S) #贪婪匹配 print(re.findall(p1, string)) print(

  • Python标准库re的使用举例(正则化匹配)

    目录 常用正则表达式 一,必备知识 1.修饰符(flag) 2.匹配模式 3. r的作用 4. 贪婪与非贪婪—通配符后面加? 5.转义匹配的使用 6. group(num = 0)和groups( ) 二,函数应用 1. re.compile(pattern,flags=0)—自定义匹配模板 2. re.match(pattern,string,flags=0)—从第一个字符开始匹配 3. re.search(pattern,string,flags=0)—不固定开始,但是只匹配第一个 4. r

  • python标准库sys和OS的函数使用方法与实例详解

    python标准库sys sys模块包括了一组非常实用的服务,内含很多函数方法和变量,用来处理Python运行时配置以及资源,从而可以与前当程序之外的系统环境交互,如:python解释器. sys模块的常见函数列表(import sys): 函数 说明 dir(sys) dir()方法查看模块中可用的方法.注意:如果是在编辑器,一定要注意要事先声明代码的编码方式,否则中文会乱码. sys.argv 实现从程序外部向程序传递参数 sys.exit([arg]) 程序中间的退出,arg=0为正常退出

  • 使用Python标准库中的wave模块绘制乐谱的简单教程

    在本文中,我们将探讨一种简洁的方式,以此来可视化你的MP3音乐收藏.此方法最终的结果将是一个映射你所有歌曲的正六边形网格地图,其中相似的音轨将处于相邻的位置.不同区域的颜色对应不同的音乐流派(例如:古典.嘻哈.重摇滚).举个例子来说,下面是我所收藏音乐中三张专辑的映射图:Paganini的<Violin Caprices>.Eminem的<The Eminem Show>和Coldplay的<X&Y>. 为了让它更加有趣(在某些情况下更简单),我强加了一些限制.

  • Python标准库之sqlite3使用实例

    Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.SQLite作为后端数据库,可以搭配Python建网站,或者制作有数据存储需求的工具.SQLite还在其它领域有广泛的应用,比如HTML5和移动端.Python标准库中的sqlite3提供该数据库的接口. 我将创建一个简单的关系型数据库,为一个书店存储书的分类和价格.数据库中包含两个表:category用于记录分类,book用于记录某个书的信息.一本书归属于某一个分类,因此book有一个外键(foreign key)

  • Python标准库urllib2的一些使用细节总结

    Python 标准库中有很多实用的工具类,但是在具体使用时,标准库文档上对使用细节描述的并不清楚,比如 urllib2 这个 HTTP 客户端库.这里总结了一些 urllib2 的使用细节. 1.Proxy 的设置 2.Timeout 设置 3.在 HTTP Request 中加入特定的 Header 4.Redirect 5.Cookie 6.使用 HTTP 的 PUT 和 DELETE 方法 7.得到 HTTP 的返回码 8.Debug Log Proxy 的设置 urllib2 默认会使用

  • Python标准库之collections包的使用教程

    前言 Python为我们提供了4种基本的数据结构:list, tuple, dict, set,但是在处理数据量较大的情形的时候,这4种数据结构就明显过于单一了,比如list作为数组在某些情形插入的效率会比较低,有时候我们也需要维护一个有序的dict.所以这个时候我们就要用到Python标准库为我们提供的collections包了,它提供了多个有用的集合类,熟练掌握这些集合类,不仅可以让我们让写出的代码更加Pythonic,也可以提高我们程序的运行效率. defaultdict defaultd

  • Python标准库defaultdict模块使用示例

    Python标准库中collections对集合类型的数据结构进行了很多拓展操作,这些操作在我们使用集合的时候会带来很多的便利,多看看很有好处. defaultdict是其中一个方法,就是给字典value元素添加默认类型,之前看到过但是没注意怎么使用,今天特地瞅了瞅. 首先是各大文章介绍的第一个例子: 复制代码 代码如下: import collections as coll    def default_factory():      return 'default value'    d =

  • 浅谈python标准库--functools.partial

    一.简单介绍: functools模块用于高阶函数:作用于或返回其他函数的函数.一般而言,任何可调用对象都可以作为本模块用途的函数来处理. functools.partial返回的是一个可调用的partial对象,使用方法是partial(func,*args,**kw),func是必须要传入的,而且至少需要一个args或是kw参数. 创建一个功能函数,实现三个数的相加,如果其中的一个或是多个参数不变,那么可以使用partial,实例化一个传入了add和12参数的对象,如上图所示,传入两个参数后

  • 如何使用Python标准库进行性能测试

    Profile 和 cProfile 在 Python 标准库里面有两个模块可以用来做性能测试. 1. 一个是 Profile,它是一个纯 Python 的实现,所以会慢一些,如果你需要对模块进行拓展,那么这个模块比较合适. 2. 第二个是 cProfile,从名字就可以看出这是一个 C 语言的实现版,官方推荐在大多数情况下使用. 这两者的接口和数据的输出格式是完全一样的,你可以在这两者之间自由的切换,所以下面我们仅以 cProfile 为例进行介绍. 使用 cProfile 进行性能测试 在

  • 用python标准库difflib比较两份文件的异同详解

    [需求背景] 有时候我们要对比两份配置文件是不是一样,或者比较两个文本是否异样,可以使用linux命令行工具diff a_file b_file,但是输出的结果读起来不是很友好.这时候使用python的标准库difflib就能满足我们的需求. 下面这个脚本使用了difflib和argparse,argparse用于解析我们给此脚本传入的两个参数(即两份待比较的文件),由difflib执行比较,比较的结果放到了一个html里面,只要找个浏览器打开此html文件,就能直观地看到比较结果,两份文件有差

随机推荐