感谢crossin大神!
# 调用范例
import re
text = "Hi, I am Shirley Hilton. I am his wife."
m = re.findall(r"hi", text) #把所有符合要求的存到列表中
if m:
print m
else:
print 'not match'
#贪婪匹配
m = re.findall(r"I.*e", text)
# 结果:['I am Shirley Hilton. I am his wife']
#懒惰匹配
m = re.findall(r"I.*?e", text)
# 结果: ['I am Shirle', 'I am his wife']
常用元字符
\b
在正则表达式中表示单词的开头或结尾,空格、标点、换行 都算是单词的分割。而“\b”自身又不会匹配任何字符,它代表的只是一个位置。所以单词前、后的空格标点之类不会出现在结果里。
[]
表示满足括号中任一字符。比如“[hi]”,它就不是匹配“hi“,而是匹配”h”或者”i”。
连续的字符,有一种简化的写法:[0-9]。类似的还有[a-zA-Z]的用法。
r
r”hi”。这里字符串前面加了 r,是 raw 的意思,它表示对字符串不进行转义。
.
在正则表达式中表示除换行符以外的任意字符。在上节课提供的那段例子文本中: Hi, I am Shirley Hilton. I am his wife.如果我们用“i.”去匹配,就会得到 [‘i,’, ‘ir’, ‘il’, ‘is’, ‘if’]。
\S
与“.”类似的一个符号是“\S”,它表示不是空白符的任意字符。注意是大写字符 S。
?
表示任意一个字符。
*
表示任意数量(包括0个)连续字符,这种被称为通配符。
在正则表达式中, 任意字符是用“.”表示,而“*”则不是表示字符,而是表示数量。
+
表示任意数量(大于0个)连续字符,这种被称为通配符。
{}
如果要限定长度,就用{}代替+,大括号里写上你想要的长度。比如 11 位的数字: \d{11}。
\d
任意一个数字。
其它
-
我们已经了解了正则表达式中的一些特殊符号,如\b、\d、.、\S 等等。这些具 有特殊意义的专用字符被称作“元字符”。常用的元字符还有:
\w - 匹配字母或数字或下划线或汉字(我试验下了,发现 3.x 版本可以匹配汉字,但 2.x 版本不可以)
\s - 匹配任意的空白符
^ - 匹配字符串的开始
$ - 匹配字符串的结束 -
\S 其实就是\s 的反义,任意不是空白符的字符。同理,还有:
\W - 匹配任意不是字母,数字,下划线,汉字的字符 \D - 匹配任意非数字的字符
\B - 匹配不是单词开头或结束的位置
[a]的反义是[^a],表示除 a 以外的任意字符。[^abcd]就是除 abcd 以外的任意 字符。 -
之前我们用过*、+、{}来表示字符的重复。其他重复的方式还有:
? - 重复零次或一次
{n,} - 重复 n 次或更多次 {n,m} - 重复n到m次
正则表达式不只是用来从一大段文字中抓取信息,很多时候也被用来判断输入的 文本是否符合规范,或进行分类。来点例子看看:
^\w{4,12}$
这个表示一段 4 到 12 位的字符,包括字母或数字或下划线或汉字,可以用来作为用户注册时检测用户名的规则。(但汉字在 python2.x 里面可能会有问题)
\d{15,18}
表示 15 到 18 位的数字,可以用来检测身份证号码
^1\d*[x]?
以 1 开头的一串数字,数字结尾有字母 x,也可以没有。有的话就带上 x。