python-正则表达式

来源:互联网 发布:成都网络综合布线 编辑:程序博客网 时间:2024/06/08 06:57

正则表达式

前言

本博文就是简单讲一下python3 的正则表达式。看完这个能达到可以初步使用。至于更深层次内容需要继续学习和查看相关资料。另外文python版本为python3.5
本文主要介绍四类正则符号。注意:这里的分类没有啥依据。
1) ^ $ * ? + {2} {2,} {2,5} |
2) [] [^] [a-z]
3)\s \S \w \W
4) [\u4E00-\u9fA5] \d

正则的使用

在python中只需要

import re

即可使用。

第一类

^

格式为^后面跟一个字符s,意思就是匹配的字符串是这个字符s开头的。

.

代表任意字符

*

格式为 * 前面跟一个字符s, 意思是*前面的字符可以重复n次。
简单例子:

import reline = "bobby123"# ^ 代表什么开头 .为任意字符 *表示前面可以重复多次regex_str="(^b.*)"match_obj=re.match(regex_str,line)if match_obj:    print(match_obj.group(1))else:    print("Nope")

注意:() 是为了提取匹配的字符串。表达式中有几个()就有几个相应的匹配字符串。所以这里只有一个所以match_obj只有group(1)
中间才是正则表达式匹配规则。
根据上面的内容,很容易看出我们正则表达式的规则是。
字母b开头后面跟任意多个字符。
结果很简单。可以match到这个字符串line。

$

格式:字符+前面的字符结尾的。
例子:

import reline = "bobby123"# ^ 代表什么开头 .为任意字符 *表示前面可以重复多次# regex_str="(^b.*)"#$ 代表以什么结尾regex_str="(^b.*3$)"match_obj=re.match(regex_str,line)if match_obj is not None:    print(match_obj.group(1))else:    print("Nope")

?

非贪婪匹配,python默认为贪婪匹配。贪婪模式和非贪婪模式可以参照这篇博文。
http://www.jb51.net/article/31491.htm
大概意思就是 贪婪模式会在匹配已经成功的基础上匹配更多字符。而非贪婪模式正好相反*非贪婪模式会在匹配成功的基础上匹配更少的字符
这里给出简单的例子:
贪婪模式:

line = "booooobby123"regex_str="(^b.*b).*"  #贪婪模式#regex_str="(^b.*?b).*"  #非贪婪模式match_obj=re.match(regex_str,line)if match_obj is not None:    print(match_obj.group(1))else:    print("Nope")

结果为:booooobb

非贪婪模式

line = "booooobby123"#regex_str="(^b.*b).*"  #贪婪模式regex_str="(^b.*?b).*"  #非贪婪模式match_obj=re.match(regex_str,line)if match_obj is not None:    print(match_obj.group(1))else:    print("Nope")

结果为:booooob

模式串的意思就是。b开头到下一个b,中间可以有任意一个字符。
对比二者的结果很容易看出。贪婪模式多了一个b, 这就是贪的那个字符

+

格式:字符 +
意义:前面的字符出现 一次以上就可以。
例子:

line="booobaobaaooobbby123"regex_str=".*(b.+o).*"match_obj=re.match(regex_str,line)if match_obj is not None:    print(match_obj.group(1))else:    print("Nope")

结果:这里不会是bao 因为’a’只出现了一次。结果是baaooo。

{}

格式:字符+{}
意义:字符允许出现的次数。
例子:

line="booobaobaaooobbby123"regex_str=".*(bo{3}).*"match_obj=re.match(regex_str,line)if match_obj is not None:    print(match_obj.group(1))else:    print("Nope")

结果为booo 因为模式串中限制了o出现的次数。
同理
{2,} 表示前面的字符出现2次以上。
{2,5} 表示前面的字符出现2到5次

|

这个就是或者的意思。

第二类

[]

这个就像一个篮子,只要满足中间的情况就可以。
例如

line="电话:13262878181"regex_str="电话:(1[34857][0-9]{9}$)"match_obj=re.match(regex_str,line)if match_obj is not None:    print(match_obj.group(1))else:    print("Nope")

结果:13262878181
这就是一个简单匹配电话号码的模式串。一步一步解释一下
()就是求字串,就是要的结果串。模式串的意思就是 第一个是数字1
[345857]意思就是第二个字符满足其中的一个就可以,第三个字符可以是[0-9]中的任意数字。{9}就是可以重复9次。(因为电话号码11位)

[^]

格式:[^1]
意义:只要不是1就可以

第三类

\s

小写s代表空格

\S

大写S只要不是空格就可以。

\w

\w为任意字符相当于[A-Za-z0-9_]
注意后面还有一个下划线,意思就是\w的效果跟上面那一串东西一个意思。
例如:

line="你d好"regex_str="(你[A-Za-z0-9_]好)"# regex_str="(你\w好)"match_obj=re.match(regex_str,line)if match_obj is not None:    print(match_obj.group(1))else:    print("Nope")

\W

大些的W意思就是取反,只要不是上面的就可以。

第四类

[\u4E00-\u9fA5]

这个意思就是匹配中文。
例子:

line="study in 复旦大学"regex_str=".*?([\u4E00-\u9fA5].*)"#\d数字match_obj=re.match(regex_str,line)if match_obj is not None:    print(match_obj.group(1))else:    print("Nope")

结果就是 复旦大学

\d

这个表示任意一个数字

掌握这么多就够用了,不过要深入研究需要看更系统的资料。
有什么问题欢迎留言讨论,一起学习进步。

原创粉丝点击