深入Python3 (Dive Into Python3)笔记5--正则表达式

一切内容都是摘抄,主要是便于回忆和鼓励自己不要间断,更详细内容请见原帖地址:

《深入 python3 》中文版

http://woodpecker.org.cn/diveintopython3/index.html

 

 

5.1. 深入

5.2. 案例研究: 街道地址

4.是时候转换到正则表达式了。在python中,所有的正则表达式相关功能都包含在re模块中。

re.sub('ROAD$', 'RD.', s)

正则表达式模块的re.sub()函数可以做字符串替换,它在字符串s中用正则表达式‘ROAD$’来搜索并替换成‘RD.’。它只会匹配字符串结尾的‘ROAD’,而不会匹配到‘BROAD’中的‘ROAD’,因为这种情况它在字符串的中间。

re.sub('//bROAD$', 'RD.', s)

为了在正则表达式中表达这个独立的词,你可以使用‘/b’。它的意思是“在右边必须有一个分隔符”。在python中,比较复杂的是‘/’字符必须被转义,这有的时候会导致‘/’字符传染(想想可能还要对/字符做转义的情况)。

re.sub(r'/bROAD$', 'RD.', s)

2.为了解决‘/’字符传染的问题,可以使用原始字符串。这只需要在字符串的前面添加一个字符‘r’。它告诉python,字符串中没有任何字符需要转义。‘/t’是一个制表符,但r‘/t’只是一个字符‘/’紧跟着一个字符t。我建议在处理正则表达式的时候总是使用原始字符串。否则,会因为理解正则表达式而消耗大量时间(本身正则表达式就已经够让人困惑的了)。

5.3. 案例研究: 罗马数字

5.3.1. 检查千位数

? 表示匹配是可选的

5.3.2. 检查百位数

5.4. 使用语法{n,m}

{1,4} 匹配1到4个前面的模式

5.4.1. 检查十位和个位

(A|B) 匹配A模式或者B模式中的一个

5.5. 松散正则表达式

松散正字表达式和普通紧凑的正则表达式有两点不同:

  1. 空白符被忽略。空格、制表符和回车在正则表达式中并不会匹配空格、制表符、回车。如果你想在正则表达式中匹配他们,可以在前面加一个/来转义。
  2. 注释信息被忽略。松散正字表达式中的注释和python代码中的一样,都是以#开头直到行尾。它可以在多行正则表达式中增加注释信息,这就避免了在python代码中的多行注释。他们的工作方式是一样的。

re.search(pattern, 'M', re.VERBOSE)

注意,如果要使用松散正则表达式,需要传递一个叫re.VERBOSE的参数。

5.6. 案例研究: 解析电话号码

/d 匹配所有0-9的数字. /D 匹配除了数字外的所有字符.

phonePattern = re.compile(r'^(/d{3})-(/d{3})-(/d{4})$')

phonePattern.search('800-555-1212').groups()

phonePattern = re.compile(r'^(/d{3})/D+(/d{3})/D+(/d{4})/D+(/d+)$')

注意了!你匹配了字符串开始,然后是3个数字的分组,接着是/D+,这是什么?好吧,/D匹配除了数字以外的任意字符,+的意思是一个或多个。因此/D+匹配一个或一个以上的非数字字符。这就是你用来替换连字符的东西,它用来匹配不同的分隔符。

5.7. 小结

现在,你应该已经熟悉了下面的技巧:

  • ^ 匹配字符串开始位置。
  • $ 匹配字符串结束位置。
  • /b 匹配一个单词边界。
  • /d 匹配一个数字。
  • /D 匹配一个任意的非数字字符。
  • x? 匹配可选的x字符。换句话说,就是0个或者1个x字符。
  • x* 匹配0个或更多的x。
  • x+ 匹配1个或者更多x。
  • x{n,m} 匹配n到m个x,至少n个,不能超过m个。
  • (a|b|c) 匹配单独的任意一个a或者b或者c。
  • (x) 这是一个组,它会记忆它匹配到的字符串。你可以用re.search返回的匹配对象的groups()函数来获取到匹配的值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章