版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
正则表达式学习笔记目录TOC\h\h一切为了您的阅读的价值\h为什么要讲述学习技巧?\hChapter1正则表达式\h第1.1节基本语法---Metacharacters/元字符\h1.1.1匹配字符的元字符3\h1.1.2匹配数量的元字符\h1.1.3位置匹配元字符\h1.1.4Group元字符\h1.1.5布尔操作元字符\h1.1.6注释和选项操作元字符\h第1.2节选项设置\h第1.3节匹配VS查找\h第1.4节匹配和搜索的使用\h第1.5节分割字符串\h第1.6节查找所有匹配结果\h第1.7节替换字符串的文字\h1.7.1在替换中使用groupnumber\h第1.8节匹配优先与忽略优先的问题\h1.8.1匹配优先的问题\h1.8.2忽略优先的问题\h1.8.3浮点数匹配问题\h第1.9节MatchObject类的使用\h1.9.1MatchObject的方法一切为了您的阅读的价值书阅读的最大成本时间才是读者付出的最大阅读成本。阅读的时间成本=选择图书所花费的时间+阅读图书所花费的时间+误读图书所浪费的卖单阅读的收益阅读图书最大的收益,来自于获取知识后,应用于自己的工作和生活,获得品质的改善和提升,视野的开阔,更宽广的心胸,由此,油然而生一种无限的满足感。业绩的增长(效率的提高)
花费
一顿饭钱职位的晋升
几次打车钱工资的晋级更好的生活条件更开阔的视野更宽广的心胸为什么要讲述学习技巧?学习如登山,路很多,但难、易不同。每人体能不同,选择正确的道路才能登顶。同理,选择适合的、最高效的学习方法至关重要。学习方法--如何阅读一本书大脑是我们进行学习器官。我们只有了解了大脑运行原理,在学习时迎合这种原理进行学习才能更高效。建议读者有时间的话,请阅读《如何阅读一本书》,它会让提高你的阅读能力。本书目标人群:没有编程语言背景,想学习编程,将学到的西应用到日常生活当中。人脑工作原理:人脑始终在搜索、扫描,寻找发现不同寻常的事物。比如危险,当这种事件发生,神经系统工作,调动激素,作出应急反映。比如看到老虎,我们的大脑会告诉我们危险,调动激素,让我们运动起来逃跑。因此,大脑对图像更敏感,同样大脑对受伤的、痛苦的、快乐的、丰富的、危险的记忆是记忆的最牢的,多少年过去仍无法忘记。如何更好的记忆知识:阅读前:明确学习目标、动机,有激情的学习;拿张白纸;学习前,在白纸上记下想要了解的问题、想法或过程;保持在学习前的注意力。学习中应建立知识的总体框架、相互联系,然后进行细节描述。先整体,后细节:保持高度的注意力。知识面覆盖:对学习的内容有大致印象。看讲座视频为1.5X或2.X。全看完,不懂的先记下来。阅读时只偶尔做笔记,或在每章节后写一段落的总结。\o"1"\h1将总结或想法可视化,图文并茂。学习完:使用交谈方式和个人风格描述您想要了解的问题、想法,如故事模式、问答。用我们自己的话解释它。无法解释的就是我们要填补的知识缺口。对付各种过程:了解每一个过程,并弄清楚它是怎么执行的。将过程可视化,图文并茂。解决问题,触动情感,作笔记。记忆事情主要依赖于它的情感内容(高兴的事,惊奇的事)。进行习题练习,每做完一题,对答案,自我审查。练习,找出什么不懂,再次翻书回顾就行重点重温。正则表达式正则表达式(RegularExpressions)是一种操作字符串的强大工具。他们是一种领域特定语言\o"2"\h2[domainspecificlanguage(DSL)],用来作为一种库存在于各种不同的编程语言中,包括Pyton。他们有几个主要任务:验证字符串匹配某个模式(比如,某个字符串是否包括邮箱地址);执行字符串中的替换操作(比如,将美式拼写转换成英式拼写)。正则表达式在Python中可通过re来访问,re是Python的标准库组成部分。注意:1、每种编程语言都规定了自己的一套专用于正则表达式的元字符。每当使用正则表达式时,都要考虑“在编程语言的字符串处理结束后,正则引擎接收到的是什么?”2、字符编码问题。字符编码是一种声明的共识,它规定不同数值的字节应该如何解释。比如,在ASCII编码中,值为十进制的110的字节代表字符'n',而在EBDC1C编码中则表示'>'。字节的值是一样的,不一样是的解释方式。基本语法---Metacharacters/元字符Metacharacters使正则表达式比正常的string方法更加强大。它允许我们创建一些表示概念的表达式,如,“一个或多个连续的vowel”。当我们在字符串中匹配那些正则表达式中的元字符中时,这时会发生冲突。我们的解决方案就是在元字符前添加“\”字符,我们称之为转义字符。元字符串语法:字母和数字代表自身;字母前有(\),表示此字母具有特殊意义;(\\)表示字符(\);标点符号前置\表示自身,没有前置\时具有特殊意义。注意:当使用RE时,为了避免冲突最好使用原始字符串。它是一个以r开头的字符串,如r”power”。匹配字符的元字符\o"3"\h3Table1.1匹配单个字符的元字符元字符语义元字符语义.匹配任何字符,除\n外(如果DOTALL模式,也匹配\n)。[...]匹配字符集中的任何一个字符。\d匹配0~9中的一个数字,相当于[0-9]。如果支持Unicode,匹配所有的Unicode数字。\D匹配除数字外的一个字符,如同[^0-9]。\s匹配1个空格字符,如同[\t\n\r\f\v]。\S匹配1个非空格字符,相当于[^\t\n\r\f\v],与\s相反。\w匹配1个字符字符。如果不设LOCALE或UNICODE,\w如同[a-zA-Z0-9_\o"4"\h4]。\W与\w相反,非字母字符。[^...]排除型字符匹配,匹配非此字符集中的一个字符。字符组容许使用者列出在某处期望匹配的若干字符,也被称为字符组(characterclass)。在字符组内部,字符组元字符'-'表示一个范围'<H[1-6]>'与'<H[123456]>'是完全一样的。注意:[]提供一种匹配字符集中某一个字符的方法。在[]中元字符表示自己,除'\'、'['、']'和‘-’字符外。\b在字符集中代表backspace字符。同理,使用[^...]表示非此集合的字符都可以使用。[^"]*会匹配'\n'字符,但在有些语言中会不匹配。想在字符串中匹配正则表达式的元字符时,我们应该使用转义字符,即在元字符前加“\”符号。Table1.2转义字符转义字符解释转义字符解释\\\\t匹配tab字符\n匹配换行字符,相当于按下Reter按键。\rCarriagereturn\||(pipe)\..(period)\--(hyphen)\^^(caret)\??\**\++\((\))\[[\]]\{{\}}匹配数量的元字符Table1.3匹配字符数量的元字符元字符语义元字符语义*匹配0或多个前部正则表达式,尽可能多的匹配+匹配1或多个前部正则表达式,尽可能多的匹配?匹配0或1个前部正则表达式,尽可能多的匹配*?匹配0或多个前部正则表达式,尽可能少+?匹配1个或多个前部正则表达式,尽可能少??匹配0或1个前部正则表达式,尽可能少{m,n}匹配m到n个前部正则表达式,尽可能多,也被称为区间量词{m,n}?匹配m到n个前部正则表达式,尽可能少{m}匹配m个前部正则表达式位置匹配元字符在字符串中匹配时,有时需要匹配一些位置,如字符串开头、结尾、部分字母开头的位置,这时位置匹配元字符就体现出它的价值了。位置匹配不会消耗字符,它只是指示位置。Table1.4位置匹配元字符元字符语义元字符语义^匹配字符串开始位置(如MULTILINE模式,则匹配\n后)$字符串结尾位置(如MULTILINE模式,则匹配\n前)(?=…)当前位置的前部字符串必须是...(?!=…)当前位置的前部字符串必须不是...(?<=…)当前位置的后部字符串必须是...(?<!…)当前位置的后部字符串必须不是...\A匹配整个字符串开始处位置\b匹配单词边界处,即开始处或结尾处的位置\B与\b相反,匹配不是单词开始或结尾处位置。通常用在某些语言或工具当中。\Z匹配整个字符串的结尾处位置Group元字符当许多个正则表达式组合到一起成为一个大型的正则表达式,这时我们就会用到Group元字符。它就类似于数学中的()符合一样,不过添加了更多意义。这意味着一个可以用其他metacharacter给Group提供参数,比如*和?。Table1.5Group元字符元字符语义元字符语义(…)匹配内部正则表达式…,并当作一个Group(?:…)与(…)相似,但不作为一个Group(?P<id>…)与(…)相似,但此Group有一个id名称(?P=id)匹配前面名称为id的Group\number匹配前部的第number个Group(Gorup自动从1至99的数字指示)正则表达式进行了分组,则返回结果也会分组,并更易操作。正则表达式可以拥有任意数量的group,从0至99(因为只有前面的99个被支持)。0表示整个正则表达式。形式:(…)
表示一个group(?P<id>...)
同上,但group有一个名称(?:...)
非分组版(...)引用分组形式:\number
引用第number个分组(?P=id)
引用名称为id的分组例如:>>>importre>>>text='010202'>>>re.findall(r'(?:[0-9]+)([0-9]+)\1',text)['02']r'(?:[0-9]+)([0-9]+)\1'与'010202'匹配,但其中的分组1为'02'而不是'01'文字。(?:[0-9])匹配的是'01'。"([a-z])([0-9])\1\2"中的'\1'代表'[a-z]'所匹配的文本,而'\2'代表"[0-9]"匹配的文本。对""这样的正则表达式,看group(1)、group(2)、group(3)是什么?importrepattern=r"egg(spam)*"ifre.match(pattern,"egg"):print("Match1")
ifre.match(pattern,"eggspamspamspamegg"):print("Match2")
ifre.match(pattern,"spam"):print("Match3")
>>>Match1Match2>>>实例2importre'''TestthefunctionofGroupinre.'''pattern=r"a(bc)(de)(f(g)h)i"match=re.match(pattern,"abcdefghiijklmnop")ifmatch:print(match.group())
print(match.group(0))
print(match.group(1))
print(match.group(2))
print(match.groups())
>>>abcdefghiabcdefghibcde('bc','de','fgh','g')>>>Group的种类re中有两种不同的Group:namedgroups和non-capturinggroups。NamedGroups的格式为(?P<name>...),其中name是Group的名字,...是内容。它与正常的Group相同,除了它可以通过group(name)来访问。Non-capturinggroups的格式为(?:...)。它们不能通过group方法访问,所以它们可以添加到现有正则表达式中,而不会影响Group的编号。importrepattern=r"(?P<first>abc)(?:def)(ghi)"match=re.match(pattern,"abcdefghi")ifmatch:print(match.group("first"))
print(match.group(1))
print(match.group(2))
print(match.groups())
>>>abcabcghi('abc','ghi')>>>特殊序列re有几种不同的specialsequences,我们可以在正则表达式中使用它。它的格式以“\”字符开头,后跟数字,如\1、\2。布尔操作元字符Table1.6布尔操作元字符元字符语义元字符语义|布尔运算中的或操作注释和选项操作元字符Table1.7注释和选项操作元字符元字符语义元字符语义(?#…)内部注释(?iLmsux)设置选项操作,影响匹配选项设置在正则表达式中提供了一种在表达式中设置RE选项的简便方法。使用iLmsux中1个或多个字母放置在'(?'和')'之间来设置RE选项,而不用再设置flag参数(pile()函数的参数)。设置的选项将影响整个RE,不管它是在何处出现。为了阅读方便,一般选项放置在表达式的开始位置。我们可以使用Compile的flag或(?iLmsux)来设置正则表达式的选项。I或IGNORECASE当前区域(locale)设置对其无影响。匹配时忽略大小写区分。L或LOCALE使用\s、\S、\w、\W、\b和\B匹配依赖当前的locale区域设置。M或MULTILINE使用特殊字符^和$匹配每行的开头和结尾(在\n前和后),同样匹配整个字符串的开头和结尾。S或DOTALL使.匹配任何字符,包括新行。U或UNICODE使\w、\w、\b、\B、\s、\S、\d和\D取决于Unicode字符属性数据库。X或VERBOSE使表达式中的空格被忽略,除非在字符集中使用转义字符。并使用#表示注释的开始,直至本行结尾。例如:下面几行代码产生的RE完全相同>>>importre>>>r1=pile(r'(?i)hello')>>>r2=pile(r'hello',re.I)>>>r3=pile(r'hello',re.IGNORECASE)注意:re.VERBOSE(或re.X)可以让你的代码更具可读性,更好理解。例如下面两个语句完全相同,但下面一个更具可读性。repat_num1=r'(0[0-7]*|0x[\da-fA-F]+|[1-9]\d*)L?\Z'repat_num2=r'''(?x)
#匹配整数的表达式
(0[0-7]*
#匹配八进制:以0开头,0+八进制数
0x[\da-fA-f]
#十六进制:以0x开头,1+个十六进制数
[1-9]\d*)
#十进制:非0开头,0+十进制数
L?\Z"""
#可选L托尾,必须在字符串结尾处
匹配VS查找正则表达式默认在目标字符串的开始位置进行匹配,就如同正则表达式以\A开始。re.math()用来决定匹配字符串开始处。如果你想在字符串任何位置开始匹配,你可以使用re.search。例如:>>>importre>>>r1=pile(r'box')>>>r1.match('inbox')
#匹配失败>>>r1.search('inbox')
#匹配成功<_sre.SRE_Matchobjectat0x013B2288>匹配和搜索的使用re.match(pattern,string[,flags])->matchObject在string的开始位置,如果0个或多个字符匹配pattern,返回一个对应的matchOjbect对象;如果不匹配,则返回none。例如:>>>importre>>>r=pile(r'box')>>>r.match('inbox')
#匹配失败,返回none>>>re.search(pattern,string,flags)->MatchObjectsearch将从string字符串开始处向前进行字符串匹配,返回第一个匹配pattern的MatchObject类对象;如果不匹配,则返回None。例如>>>importre>>>print(re.search('super','superstition').span())(0,5)>>>print(re.search('super','insuperable').span())(2,7)分割字符串有时,我们使用正则表达式对字符串分割。re.split(pattern,string[,maxsplit=0])->list使用匹配pattern的字符串来分割string,返回分割后的结果字符串list列表对象。如果()捕获括号在pattern中使用,在pattern匹配的所有group字符串也在返回的list当中。如果maxsplit为非0,最多maxsplit的分割发生,剩下的字符串将作为list的最后一个元素。>>>importre>>>re.split('\W+','Words,words,words.')['Words','words','words','']>>>re.split('(\W+)','Words,words,words.')['Words',',','words',',','words','.','']>>>re.split('\W+','Words,words,words.',1)['Words','words,words.']>>>如果pattern匹配字符串在开头或结尾处,则结果相应的将以空字符串开头或结尾。>>>re.split('(\W+)','...Words,words,words...')['','...','Words',',','words',',','words','...','']>>>注意:如果split发生空匹配时将不会分割字符串。>>>re.split('x*','foo')['foo']查找所有匹配结果findall(pattern,string[,flag])->list返回匹配pattern的字符串组成的列表。若pattern有group,若多个group的话,则返回由tuple组成的list,每个tuple中包含对应Group的字符串。例如:>>>importre>>>text="Hewascarefullydisguisedbutcapturedquicklybypolice.">>>re.findall(r'\w+ly',text)['carefully','quickly']>>>re.findall(r'(\w+)(ly)',text)[('careful','ly'),('quick','ly')]>>>finditer(pattern,text)返回一个枚举器,可以由for...in语句使用。例如:>>>forminre.finditer(r'\w+ly',text):
print(m)<_sre.SRE_Matchobjectat0x013BB1A8><_sre.SRE_Matchobjectat0x013BB1E0>替换字符串的文字re库中最长使用的一个方法是sub。re.sub(pattern,repl,string[,max=0])->stringmax为替换次数,必须非负。若为0,则替换所有的匹配。此方法将string中的所有匹配pattern的字符串替换成repl,替换所有,除非max设置次数;此方法返回修改后的字符串。例如:>>>importre>>>text='you\'renofun'>>>re.sub('fun','ok',text)"you'renook">>>re.sub('\W+','-',text)'you-re-no-fun'在替换中使用groupnumber利用re.sub强大功能最简单方法是在替换字符串中使用groupnumber。在被替换字符串的形如'\\n'转义序列会被与groupn匹配的字符串替换。例如:>>>importre>>>emphasis_pattern=r'\*([^\*]+)\*'>>>re.sub(emphasis_pattern,r'<em>\1</em>','Hello,*world*!')'Hello,<em>world</em>!'匹配优先与忽略优先的问题匹配优先的问题'.*'经常会匹配到一行文本的结尾处。这是因为*是匹配优先,它会尽可能多的匹配,但这样就会出现问题。例如,我们想匹配下面文字中的""内部文字。Thename"mc"issaid"maku"inTapanese.用'".*"'去匹配,因为是匹配优先,会得到上面画线部分的结果。这并不是我们想要的结果。我们用'"[^"]*"'来得到我们想要的结果。忽略优先的问题*?是与*相对应的忽略优先量词对于HTML中的<B>...</B>,我们若想匹配<B>和</B>中的文字,就会用到忽略优先量词。我们也可以用到<B>.?</B>来匹配所需要文字。但它会匹配"<B>...<B>...</B>"这样的文本。为了解决这一问题,我们可以用排除环视(?!...)来完成此功能。如:<B>(
(?:(?!<B>).)*)</B>
即可匹配<B>
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工程监理借款协议书
- 工资限期支付协议书
- 帮打架无责协议书
- 广东婚内财产协议书
- 店面合伙解散协议书
- 延期交付维修协议书
- 建筑定金协议书范本
- 引流免责协议书
- 律师代管协议书
- 情侣条约协议合同
- 2026恒丰理财有限责任公司社会招聘备考题库含答案详解(完整版)
- 2026重庆两山建设投资集团有限公司招聘8人考试备考试题及答案解析
- 2026浙江杭州市属监狱警务辅助人员招聘85人笔试备考试题及答案详解
- 部编版四年级语文下册期中试卷+ 答题卡(含答案)
- 2023年宁强县中医院高校医学专业毕业生招聘考试历年高频考点试题含答案解析
- GB/T 5783-2016六角头螺栓全螺纹
- GB/T 5005-2010钻井液材料规范
- GB/T 4857.17-2017包装运输包装件基本试验第17部分:编制性能试验大纲的通用规则
- (完整word版)三级安全教育记录及表格(全)
- GA/T 16.31-2017道路交通管理信息代码第31部分:交通违法行为类别代码
- 预制梁首件施工方案
评论
0/150
提交评论