什么是正则表达式?

我们在处理文本文件的时候,会按照某种规则查找某些特定的字符串。比方我们希望从一堆电子档案中找到人员的电话号码整理成通讯录。于是,我们可以利用特定字符串的规律编程获得我们想要的信息。而正则表达式就是干这个事情的,它是记录文本规则的代码。

一、获得简单字符串


1. 如何我们 希望找到"hi"字符,how?

例如:Hi, I am Shirley Hilton. I am his wife.  希望寻找“hi”的字符。

用如下代码:
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')
['hi', 'hi']

代码的简单说明:
(1)字符串前面加了r,是raw的意思,它表示对字符串不进行转义。
(2)re是python里的正则表达式模块。findall是其中一个方法,用来按照提供的正则表达式,去匹配文本中的所有符合条件的字符串。返回结果是一个包含所有匹配的list。



2. 如果我们希望找到"hi"这个单词,过滤掉包含它的单词,how?
可以使用"\bhi\b"“\b”在正则表达式中表示单词的开头或结尾,空格、标点、换行都算是单词的分割。而“\b”自身又不会匹配任何字符,它代表的只是一个位置。所以单词前后的空格标点之类不会出现在结果里。


3. 如果我们希望找到"hi"和"Hi",how?
可以使用[]在正则表达式中,[]表示满足括号中任一字符。比如“[hi]”,它就不是匹配“hi”了,而是匹配“h”或者“i”。在前面例子中,如果把正则表达式改为“[Hh]i”,就可以既匹配“Hi”,又匹配“hi”了。

4. 如果我们希望得到"i"加上任意一个字符,how?
(1)可以使用"."“.”在正则表达式中表示除换行符("\n")以外的任意字符。例如我们用“i.”去匹配,就会得到:
['i,', 'ir', 'il', 'is', 'if']
(2)可以使用“\S”,它表示不是空白符的任意字符。注意是大写字符S。

5. 如果我们希望得到"I"开头,"e"结尾的字符串,how?
可以使用“*”,“*”表示任意数量连续字符,这种被称为通配符。但在正则表达式中,任意字符是用“.”表示,而“*”则不是表示字符,而是表示数量:它表示前面的字符可以重复任意多次(包括0次),只要满足这样的条件,都会被表达式匹配上。
用“I.*e”去匹配,得到:
['I am Shirley Hilton. I am his wife'],贪婪匹配
用“I.*?e”去匹配,得到:
['I am Shirle', 'I am his wife'],懒惰匹配


二、获取数字常用元字符


[01234]:任意一个数字
[0-4]:任意一个数字
\d:表示数字
[0-4]* or \d*:任意长度的数字(包括0,也就是没有数字的空字符也会被匹配出来)
[0-4]+ or \d+:》1长度的任意数字
\d{11}:最大长度为11
1\d{10}:第一位限定为1,剩余长度最大为10

三、其他常用的元字符

1.

w - 匹配字母或数字或下划线或汉字(我试验下了,发现3.x版本可以匹配汉字,但2.x版本不可以)

\s - 匹配任意的空白符

^ - 匹配字符串的开始

$ - 匹配字符串的结束


2.

\S其实就是\s的反义,任意不是空白符的字符。同理,还有:


\W - 匹配任意不是字母,数字,下划线,汉字的字符

\D - 匹配任意非数字的字符

\B - 匹配不是单词开头或结束的位置


[a]的反义是[^a],表示除a以外的任意字符。[^abcd]就是除abcd以外的任意字符。


3.

之前我们用过*、+、{}来表示字符的重复。其他重复的方式还有:

? - 重复零次或一次

{n,} - 重复n次或更多次

{n,m} - 重复n到m次


正则表达式不只是用来从一大段文字中抓取信息,很多时候也被用来判断输入的文本是否符合规范,或进行分类。来点例子看看:

^\w{4,12}$

这个表示一段4到12位的字符,包括字母或数字或下划线或汉字,可以用来作为用户注册时检测用户名的规则。(但汉字在python2.x里面可能会有问题)


\d{15,18}

表示15到18位的数字,可以用来检测身份证号码


^1\d*x?

以1开头的一串数字,数字结尾有字母x,也可以没有。有的话就带上x。


另外再说一下之前提到的转义字符\。如果我们确实要匹配.或者*字符本身,而不是要它们所代表的元字符,那就需要用\.或\*。\本身也需要用\\。

比如"\d+\.\d+"可以匹配出123.456这样的结果。


举例:尝试写一个可以匹配以下电话号码的表达式

(021)88776543

010-55667890

02584453362

0571 66345673



表达式:\(?0\d{2,3}[) -]?\d{7,8}




        
posted on 2017-08-22 16:46  未雨愁眸  阅读(244)  评论(0编辑  收藏  举报