fanyear

本来想重新把基础部分再看一遍

但是又想想

还不如直接往下看

不懂再往前查

这样还记得牢一些

等以后再看回基础 

再巩固

看了看正则表达式

python确实好用

这里只是粗略看了看

用到再回来查

明天学网络编程

2.1 介绍/动机
  处理文本和数据是件大事。如果您不相信我说的话,请仔细看看现如今的计算机主要都在做些什么工作。文字处理、网页填表、来自数据库的信息流、股票报价信息、新闻列表,这个清单还会不断地增长。因为我们可能不知道这些需要计算机编程处理文本或数据的具体内容,所以能把这些文本或数据以某种可被计算机识别和处理的模式表达出来是非常有用的。假设我在运营一个电子邮件档案公司,而您是我的一位顾客,比如说,您想获得自己去年二月间收发的所有邮件,如果我能设计一个计算机程序来整理信息然后将它转发给您,而不是通过人工方法通读您的邮件后再手动地处理您的请求,如此处理将会非常不错。因为如果有人会看遍您的邮件信息,哪怕只是是用眼睛看一下邮件上的时间,您可能都会对此感到担心(甚至愤怒)。又比如,您可能会认为凡是带有“ILOVEYOU”这样主题的邮件都是已感染病毒的信息,并要求从您的个人邮箱中删除它们。这就引出一个问题,我们如何通过编程使计算机具有在文本中检索某种模式的能力。正则表达式(RE)为高级文本模式匹配,以及搜索-替代等功能提供了基础。正则表达式(RE)是一些由字符和特殊符号组成的字符串,它们描述了这些字符和字符的某种重复方式,因此能按某种模式匹配一个有相似特征的字符串的集合,因此能按某模式匹配一系列有相似特征的字符串 。换句话说,它们能匹配多个字符串 - 一个只能匹配一个字符串的RE 模式是乏味且毫无作用的,你说是不是。

 

你可以用这个正则表达式匹配有效的Python 标志符。 "[A-Za-z]\w+ " 的含义是:第一个字符是字母,即,由大写字母A 到Z 或是小写字母a 到z 组成, 它后面至少(+)跟有一个由字
母或数字组成的字符(\w). 如图,你看到有很多字符串被过滤,只有那些符合我们要求的RE 模式的字符串被筛选出来。比如,“4xZ”,因为它是以数字开头的,所以被过滤了。
Python 通过标准库的re 模块支持正则表达式(RE)。本节我们将向你简要地介绍这。限于篇幅,内容将仅涉及Python 编程中正则表达式(RE)方面最常见的内容。你们(对正则)的经验(熟悉程度)肯定不同。我们强烈建议您阅读一些官方帮助文档和与此主题有关的文本。那么你对字符串的理解方式就会有所改变。


核心笔记:查找与匹配的比较
  本章通篇涉及到对查找和匹配用法的讲述。当我们完全讨论与字符串中模式有关的正则表达式时,我们会用术语 “matching”(“匹配”),指的是术语pattern-matching(模式匹配)。在Python
专门术语中,有两种主要方法完成模式匹配:搜索(searching)和匹配(matching)。搜索,即在字符串任意部分中查找匹配的模式,而匹配是指,判断一个字符串能否从起始处全部或部分的匹配某个模式。搜索通过search()函数或方法来实现,而匹配是以调用match()函数或方法实现的。总之,当我们说模式的时候,我们全部使用术语“matching”(“匹配”);我们按照Python 如何完成模式匹配的方式来区分“搜索”和“匹配”。

2.1.1 您的第一个正则表达式
  我们上面已经提到,正则表达式是含有文本和特别字符的字符串,这些文本和特别字符描述的模式可以识别各种字符串。我们还简单阐述了正则表达式字母表,以及用于匹配通用文本的正则表达式字母表——所有大小写字母及数字的集合。也存在特别的字母表,比如,只含有字符"0"和"1"的字母表. 该字母表可以表示所有二进制整数的集合,即,"0," "1," "00," "01," "10," "11,"
"100," 等.

  让我们看看正则表达式的基本情况,虽然正则表达式常被视为是“高级主题”,有时候它们也是非常简单的。我们列出一些用一般文本的标准字母组成简单的正则表达式及它们所描述的字符串。
以下的正则表达式是最基本,最普通的。它们仅由一个字符串定义了一个模式,该模式仅匹配这个字符串本身,该字符串由正则表达式定义。以下是正则表达式(RE)和匹配它们的字符串。
RE Pattern String(s) Matched
foo foo
Python Python
abc123 abc123
上表中第一个正则表达式模式是"foo"。这个模式不包含任何特殊符号去匹配其他符号,它仅匹配自身所描述的,所以只有字符串"foo"匹配此模式。同理,“Python”和“abc123.”也一样。正则
表达式的强大之处在于特殊符号的应用,特殊符号定义了字符集合,子组匹配,模式重复次数。正是这些特殊符号使得一个正则表达式可以匹配字符串集合而不只是一个字符串。

2.2 正则表达式使用的特殊符号和字符
  现在,我们来介绍最常用的元字符(metacharacters)——特殊字符和符号,正是它们赋予了正则表达式强大的功能和灵活性。正则表达式中最常见的符号和字符见表15.1.
  表15.1 常用正则表达式符号和特殊字符
    记号                说明    

  SYMBOLS

  literal                 匹配字符串的值   

  re1|re2                匹配正则表达式   

  .                   匹配任何字符(换行符除外)   

  ^                   匹配字符串的开始   

  $                    匹配字符串的结尾   

  *                    匹配前面出现的正则表达式0次或多次

  +                  匹配前面出现的正则表达式1次或多次

  ?                匹配前面出现的正则表达式0次或1次

  {N}                  匹配前面出现过得正则表达式n次

  {M,N}              匹配重复出现M到N次的正则表达式

  [.....]                匹配字符组里出现的任一字符

  [..x-y..]                匹配从字符x到y的任一字符

  [^...]                不匹配此字符集里的任一字符包括某一范围内的字符

  |*|+|?|              用于上面出现的任一“非贪婪”版本重复匹配次数(*+?{})

  {...}                匹配封闭括号中的正则表达式,并保存为子组

  \d                    匹配任何数字

  \w                     匹配任何数字字母字符

  \s                    匹配任何空白符

  \b                     匹配单词边界

  \nn                    匹配以保存的子组

  \c                    逐一匹配特殊字符

  \A(\Z)                  匹配字符串的起始(结束)

 

2.2.1 用管道符号( | )匹配多个正则表达式模式
  管道符号( | ), 就是您键盘上的竖杠,表示一个或操作,它的意思是选择被管道符号分隔的多个不同的正则表达式中的一个。例如,下面的一些使用或操作的模式,和它们所匹配的字符串:

 

  正则表达式模式          匹配的字符串

  at|home              at,home

  r1|r2                r1,r2

 

15.2.2 匹配任意一个单个的字符( . )
  点字符或句号(.)符号匹配除换行符(NEWLINE)外的任意一个单个字符(Python 的正则表达式有一个编译标识 [S or DOTALL],该标识能 去掉 这一限制,使 ( . ) 在匹配时包括换行符(NEWLINEs)。)(这里括号缺一半) 无论是字母、数字、不包括“\n”的空白符、可打印的字符、还是非打印字符,或是一个符号,“点”,( . )都可以匹配他们。


    正表达式模式         匹配的字符串
      f.o             在"f"和"o"中间的任何字符,如fao, f9o, f#o 等
      ..              任意两个字符
      .end             匹配在字符串end 前面的任意一个字符


问:我怎样才能匹配点号(dot)或句号(period)?
答:为了明确地匹配一个点号(dot)本身,你必须(在前面)使用反斜线“\”对它进行转义。


15.2.4 从字符串的开头或结尾或单词边界开始匹配( ^/$ /\b /\B )
  还有些符号和特殊字符是用来从字符串的开头或结尾开始搜索正则表达式模式的。如果想从字符串的开头开始匹配一个模式,你必须用脱字符号( ^ , 即,Caret)或特殊字符 \A (大写字母A 前面加上一个反斜线). 后者主要是为那些没有caret 符号的键盘使用的,比如说国际键盘。类似,美元符号 ( $ ) 或 \Z 是用来(零宽度)匹配字符串的结尾的。用这些符号的模式与我们将在本章讲述的其它大多数符号是不同的,因为这些符号指定了(匹配字符)的位置。在上面的核心笔记里,我们曾说过 “matching”和“searching” 之间的区别,“matching”是试图从整个字符串的开头进行匹配,而 “searching” 则可从一个字符串的任意位置开始匹配。正因为这几个字符和搜索的位置有关,所以需要和搜索模式一起使用。下面是几个“擦边球”的正则表达式搜索模式:

 

正则表达式模式         匹配的字符串
^From             匹配任何以From 开始的字符串
/bin/tcsh$           匹配任何以 /bin/tcsh 结束的字符串
^Subject: hi$         匹配仅由 Subject: hi 组成的字符串
特别说明,如果你想匹配这两个字符中的任何一个(或全部),就必须用反斜线进行转义。例如,如果你想匹配任何以 美元符号($) 结尾的字符串,一个可行的解决办法是用正则表达式模式
“.*\$$”.特殊字符 \b and \B 用来匹配单词边界。两者之间的区别是,\b 匹配的模式是一个单词边界,就是说,与之对应的模式一定在一个单词的开头,不论这个单词的前面是有字符(该词在一个字符串的中间),还是没有字符(该单词在一行的起始处)。同样地,\B 只匹配出现在一个单词中间的模式(即,不在单词边界上的字符)。看下面几个例子:


RE Pattern       Strings Matched
the           任何包含有"the"的字符串
\bthe           任何以"the"开始的字符串
\bthe\b         仅匹配单词 “the”
\Bthe         任意包含“the”但不以“the”开头的单词

 

15.2.5 创建字符类( [ ] )
尽管点号可用来匹配任意字符,但有时候你需要匹配某些个特殊的字符。正因为如此,方括号( [ ] )被发明出来。使用方括号的正则表达式会匹配方括号里的任何一个字符。几个例子如下:
正则表达式模式       匹配的字符串

b[aeiu]t         bat, bet, bit, but
[cr][23][dp][o2]     一个包含4 个字符的字符串: 第一个字符是 “r” 或 “c”,后面是 “2”或 “3”,再接下来是 “d” 或 “p”,最后是 “o” 或 “2“ ,例如:c2do, r3p2, r2d2, c3po, 等等。


关于正则表达式 “[cr][23][dp][o2]” 的一点要说明: 如果只让 “r2d2” 或 “c3po” 成为有效的字符串,就需要限定更为严格的正则表达式。但因为方括号只有"逻辑或"(“logical OR”)
的功能,所以用方括号不能实现这一限定要求。唯一的解决办法是用管道符号(pipe), 例如:

“r2d2|c3po”.
  对仅有单个字符的正则表达式 ,使用管道符号和方括号的效果是等价的。举例来说,正则表达式“ab” , 只匹配以"a"开头后面再跟一个"b"的字符串。如果我们只想要一个字母的字符串,即,
“a” 或者 “b” 中的一个,就可以使用正则表达式 “[ab]” 。因为 “a” 和 “b” 是单个的字符串,我们也可以用正则表达式 “a|b”。但是,如果我们想用模式匹配"ab",后面接着是"cd"的字符串,就不能用方括号了,因为方括号只适用于单个字符的情况。这样,唯一的办法是用“ab|cd”,这和我们刚才提到的 “r2d2|c3po”的道理是相同的。

 

2.2.5 指定范围 ( - ) 和 否定( ^ )
  方括号除匹配单个字符外,还可以支持所指定的字符范围。方括号里一对符号中间的连字符(-)用来表示一个字符的范围,例如,A–Z, a–z, 或 0–9 分别代表大写字母、小写字母和十进制数
字。这是一个按字母顺序排序的范围,所以它不限于只用在字母和十进制数字上。另外,如果在左方括号后第一个字符是上箭头符号(^),就表示不匹配指定字符集里的任意字符。

正则表达式模式           匹配的字符
z.[0-9]          字符"z",后面跟任意一个字符,然后是一个十进制数字
[r-u][env-y][us]       “r” “s,” “t” 或 “u” 中的任意一个字符,后面跟的是 “e,”“n,” “v,” “w,” “x,” 或 “y”中的任意一个字符,再后面是字符“u” 或 “s”.
[^aeiou]         一个非元音字符 (练习: 为什么我们说”非元音“, 而不说”辅音字母“?)
[^\t\n]           除TAB 制表符和换行符以外的任意一个字符
["-a]             在使用ASCII 字符集的系统中,顺序值在‘"‘ 和 “a”之间 的任意一个字符,即,顺序号在34 和97 之间的某一个字符。

 

 


15.2.6 使用闭包操作符 ( *, +, ?, {} ) 实现多次出现/重复匹配


现在我们来介绍最常用的正则表达式符号,即,特殊符号 “*”, “+”, 和 “?”, 它们可以用于匹配字符串模式出现一次、多次、或未出现的情况。星号或称星号操作符匹配它左边那个正则
表达式出现零次或零次以上的情况(在计算机语言和编译器原理里,此操作符被叫做 Kleene 闭包操作符)。加号(+)操作符匹配它左边那个正则表达式模式至少出现一次的情况(它也被称为正闭包操作符),而问号操作符( ? )匹配它左边那个正则表达式模式出现零次或一次的情况。还有花括号操作符({ }), 花括号里可以是单个的值,也可以是由逗号分开的一对值。如果是
一个值,如,{N},则表示匹配N 次出现;如果是一对值,即,{M, N},就表示匹配M 次到N 次出现。可以在这些符号前用反斜线进行转义,使它们失去特殊作用,即, “\*” 将匹配星号本身等。在上表中,我们注意到问号出现了不只一次(被重载),问号有两种含义:1.单独使用时表示匹配出现零次或一次的情况,2.紧跟在表示重复的元字符后面时,表示要求搜索引擎匹配的字符串越短
越好。例如:(+?)

前面提到"越短越好..."是什么意思呢?当使用了表示重复的元字符(*+?{m,n})时,正则表达式引擎在匹配模式时会尽量"吸收"更多的字符。这就叫做"贪心"。问号告诉正则表达式引擎尽可能地
偷懒,要求当前匹配消耗的字符越少越好,留下尽可能多的字符给后面的模式(如果存在)。 - 在本章末尾,我们举一个有代表性的例子来说明必须使用非贪心模式的情况。
现在,让我们接着来看一些使用闭包操作符的例子:
RE Pattern                   Strings Matched
[dn]ot?                     字符"d"或"o", 后面是一个"o", 最后是最多一个字符"t",即,do, no, dot,not
0?[1-9]                  从1 到9 中的任意一位数字,前面可能还有一个"0". 例如:可以把它看成一月到九月的数字表示形式,不管是一位数字还是两位数字的表示形式。
[0-9]{15,16}             15 或16 位数字表示,例如:信用卡号码
</?[^>]+>                 匹配所有合法(和无效的)HTML 标签的字符串
[KQRBNP][a-h][1-8]-[a-h][1-8]        在“长代数”记谱法中,表示的国际象棋合法的棋盘。即, “K,” “Q,” “R,” “B,” “N,” 或 “P” 等字母后面加上两个用                   连                       起"a1"到"h8"之间的棋盘坐标。前面的编号表示从哪里开始走棋,后面的编号代表走到哪个位置(棋格)去。

 

 

2.2.8 用圆括号(()) 组建组

  
现在,或许我们可以匹配一个字符串和丢弃那些不匹配的字符串了,但有时候,我们也许对匹配的数据本身更有兴趣。我们不仅想知道是否整个字符串匹配我们的条件(正则表达式),还想在匹
配成功时取出某个特定的字符串或子字符串。要达到这个目的,只需要给正则表达式的两边加上一对圆括号。


  一对圆括号(()) 和正则表达式一起使用时可以实现以下任意一个(或两个)功能:
  

分类:

技术点:

相关文章: