【卷一】正则一 之re.split
有时候,用re.split()匹配字符串会比findall,search, match等
正则表达式对象方法方便简洁很多!
参考: 《Python核心编程(3rd)》—p23
如果给定分隔符而不是使用像句点 '.'、'\w'这样的特殊符号来构成正则表达式,那么re.split()和str.split是一样的
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # coding: utf-8 2 3 # 导入re, RegEx:(Regular Expressions)正则表达式 4 import re 5 6 # 一般来说,用 "" 包围起来的就是(string)字符串 7 # print type(txt)可打印txt的类型 8 txt = "Welcome to our school!" 9 # 按空格分割字符串 10 print re.split(" ", txt) 11 print "--" * 20 12 # 或者写成txt.split()的形式 13 print txt.split(" ")
下面进入主题,用re.split()来做点事!附上用findall捣鼓的匹配
# coding: utf-8 import re data = ( "Mountain View, CA 94040", "Sunnyvale, CA", "Los Altos, 94023", "Cupertino 95014", "Palo Alto CA", ) # 按元组的元素迭代,也就是一行行列出来(eachline) for eachline in data: # 切掉5个连续的数前面的空格|切掉2个连续的大写字母前面的空格 print re.split(r", | (?=\d{5}| (?=[A-Z]{2}))", eachline) # 我们要的是总的分组/子组,里面的用(?: )括起来表示不保存! # print re.split(r", | (?=(?:\d{5}|[A-Z]{2}))", eachline)
? 其实上面的正则表达式还可以写成这种
", |(?= \d{5}) |(?= [A-Z]{2}) "或
", |(?= (?:\d{5}|[A-Z]) "
不过想不通这种把空格放在最后面的原理是什么!
.: 是句点,又叫点号,匹配除 '\n' 外的任何字符
| :管道符号,a|b 表示匹配a或b,因此又叫择一匹配符号
+: 重复前面的字符1到多次, '.+' 就是匹配除'\n'外的字符多次,也就是
我们要匹配的字符串有多少个字符,它就匹配多少个,'.+,' 匹配任何字符
直到遇到逗号为止!
\w:匹配字母和数字,\w+就是匹配一个单词或多个字母或数字,(\w+ )+
表示匹配多少字母和空格!
\d:是匹配数字,{5}表示匹配前面的字符5次,\d{5}就是匹配5个数字,
$: 表示从后开始匹配, \d{5}$ 表示匹配后面是五位数字的字符,相对应
的脱字符 '^' 表示从头开始匹配
[A-Z]是匹配26个大写字母的任一个,[A-Z]{2}就是匹配两个大写字母 !
(?= ):比如(?= (?:\d{5})表示它后面是空格加五位数字的字符,好吧,
有点乱,再来,比如,(\w+)(?= abc)表示匹配后面是"空格加abc"的\w+
即字母或者数字!
(?: ): 通常加括号的比如(\w+)都是我们要的分组,也就是子组,但是有
一些不是我们要的,却不得不要的,所以给它这个符号,表示不保存该分组!