python 正则表达式

python在1.5版本时使用re模块来处理正则表达式,提供perl风格的正则模式。

用处:

a.判断字符串是否满足某个条件---判断输入的字符串是否是邮箱/ 手机号码。是否是ip地址
b.提取满足条件的字符串
c.字符串替换

 

编译正则表达式,使用re.compile

函数compile(pattern [,flags])

参数pattern,模式字符串,即正则表达式。

可选参数flags,标志位,用来修改正则表达式的匹配方式

返回一个pattern对象

标志位参数:

re.I(re.IGNORECASE)  使匹配对大小写不敏感

re.L(re.LOCAL)  做本地化识别匹配

re.M(re.MULTILINE)  多行匹配,影响^和$

re.S(re.DOTALL)  使匹配包括换行在内的所有字符

re.U(re.UNICODE)  根据Unicode字符集解析字符,影响\w,\W,\b,\B

re.X(re.VERBOSE)  通过给予你更灵活的格式以便你将正则表达式写得更易于理解

 如:

string=r'wan\w'
html='Citizen wang,always fall in love with neighbour, WANG'
pa=re.compile(string,re.I)
li=pa.findall(html)
print(li)

最后返回一个列表:['wang', 'WANG']

注:\w,表示匹配任意单词字符,和[a-zA-Z0-9_]等价(包括下划线)

 

re.match()函数

总是从字符串开头匹配,并返回match对象。通过match对象的group()或group(0)获得匹配的结果。

  re.match(pattern,string[,flags=0])

如:

>>>ma=re.match('\w','_hello')

>>>ma.group()

最后返回:'-'

若:

>>>ma=re.match('\w','?hello')

>>>ma.group()

最后返回:AttributeError: 'NoneType' object has no attribute 'group'

 

re.search()函数

对整个字符串进行搜索匹配,返回第一个匹配的match对象。

re.search(pattern,string[,flags=0])

>>>ma=re.match('e\wl','_hello')

>>>ma.group()

最后返回:ell

 

re.split()

分割字符串

split(pattern, string, maxsplit=0, flags=0)

单一分割符时与str.split(self, /, sep=None, maxsplit=-1)方法一样

 

re.sub()

sub是substitute,即字符串替换

sub(pattern, repl, string, count=0, flags=0)

如:string='a 111 b 111' 将111替换成222

也可以用str.replace(self, old, new, count=-1, /)

 

常用元字符:

.    匹配一个任意字符(除换行以外) ,要匹配包括换行[.\n]

\d    匹配一个数字字符,等价[0-9] 

\s    匹配一个任意空白字符 ,等价于[\f\n\r\t\v]

\w    匹配一个任意单词字符和下划线,等价于[a-zA-Z0-9_]

 \b    匹配一个单词边界,不匹配任何实际字符,看不到。

^    匹配字符串的开始

$    匹配字符串的结束

|    A|B  表示匹配正则表达式 A 或者 B 

 

重复:

*    重复0次或多次

+    重复1次或多次

?    重复0次或1次

{n}    重复n次

{n,}    重复n次或多次

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

 

反义:

\D    \S    \W    \B    [^x]

 

字符集:[]

匹配一个字符,这字符是字符集中的任意一个字符。

例如:

[abc], [\d+]

[字符1-字符2] --> 匹配一个字符,这个字符是Unicode编码值在字符1到字符2中的任意一个字符;要求字符1的编码值要小于字符2

例如:

[1-9] --> 数字1到9 [a-z] --> 小写字母 [A-Z] --> 大写字母

[\u4E00-\u9fa5] --> 匹配所有的汉字 

注意:-在中括号中,如果放在两个字符之间表示范围。

 

 分组:()

 

懒惰匹配:在重复限定符后面加?号。

当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。

例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。

有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数

量的重复,但是在能使整个匹配成功的前提下使用最少的重复。

例:a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。

posted @ 2019-07-17 19:47  隐泉  阅读(187)  评论(0编辑  收藏  举报