正则表达式-初级使用

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

正则表表达式的用途多在于数据的筛选,匹配,提取,举例子:文件夹下众多文件的过滤,提取网页标签内容,匹配输入的电话号ip地址等。我会用自己使用正则的理解,简单、通俗的解释一下。

(首先给一个在线测试的网站吧,大家可以自己随意敲一敲 http://tool.oschina.net/regex/ 用了很久了 感觉还可以)

在人为的匹配中也不外乎特定字符,字符类型和出现次数,出现位置等模式,我们一一介绍

(提前说一下,正则内置了很多功能字符,如果要匹配这些功能字符,那么请使用\注释,例如(){}.*等字符)

 

正则可以使用固定的字符匹配

 ADBFDKASDFJF
KASDFDIAFD

 

匹配范围

正则可以通过[]和-指定匹配的范围

[xyz] 可以匹配x,y,z中的任何一个字符

[0-9] 可以匹配0-9之间的任何字符, 并且依旧允许添加集合元素 例如[0-9ASDF] 可以匹配0123456789ASDF中的任何一个

例如:
9S8DF
6A5FD    # 我们要匹配数字字母数字的形式

因为A-N不包含S所以会失败,不过我们可以单独添加S元素

 

匹配类型

不仅支持匹配特定的元素,我们可以值匹配数字 只匹配字母 只匹配空白字符,正则内置了这样的通配符,让我们可以匹配一类字符,常用的

\d	匹配一个数字字符。等价于 [0-9]。
\D	匹配一个非数字字符。等价于 [^0-9]。
\w	匹配字母、数字、下划线。等价于'[A-Za-z0-9_]'。
\W	匹配非字母、数字、下划线。等价于 '[^A-Za-z0-9_]'。
.  匹配除换行符(\n、\r)之外的任何单个字符

 

匹配数目

正则表达式支持匹配的个数,常用的有

+     匹配前面的子表达式一次或多次
?	  匹配前面的子表达式零次或一次
{n}   匹配前面的子表达式n次
{n,}   匹配前面的子表达式至少n次
{n,m}   匹配前面的子表达式至少n次,至多m次
*	匹配前面的子表达式零次或多次,等价于{0,}。

我们配合上面的类型,下载来匹配电话号

名字:hcac 电话:1248371947321
名字:fkr     电话:1831384830204

 

逻辑控制

( ) 用来表示子匹配表达式 在得到满足的整体之外,子表达式也会匹配输出

|  或匹配  用于表示或匹 可以匹配两个子匹配中的任何一个

^ 非匹配 用于方括号中表示不匹配的集合

演示一下  匹配其中的数字字母连续切换的部分 我们可以将一个数字字母视作一个子匹配,使用{n,m}控制次数 使用+也是可以的

6D6F8S9GAAA  
0G9S6S5FCCC
0G9S6SDDD

|允许我们人为的设置多个匹配条件,比如我只想要北京和南京的

南京 108 35879
北京 203 293842
广州 100 34930
北京 120 189475      # (北京)|(南京) \d+ 这样是不对的 会将整个句子视作两个匹配

^用于反向匹配,也就是不包括哪些字符

A1234
B1234
C1234
D1234

 

说的这些也没什么意思...来点小例子

# 匹配章节名称

chapter(1) new house
There are moments in life when you miss someone so much that you just want to pick them from your dreams and hug them for real! Dream what you want to dream;go where you 
chapter(2) good boy
May you have enough happiness to make you sweet,enough trials to make you strong,enough sorrow to keep you human,enough hope to make you happy? Always put yourself in others’shoe
chapter(3) nice bird
The happiest of people don’t necessarily have the best of everything;they just make the most of everything that comes along their way.



chapter\(\d\)[ a-z]+
共找到 3 处匹配:
chapter(1) new house
chapter(2) good boy
chapter(3) nice bird

这里匹配()需要加上注释,因为()有特殊含义

 

# 匹配url中的域名 端口和资源定位

import re

url = "https://blog.csdn.net:8080/yuekunge/article/details/14124159.html"
par = re.compile(pattern=u"https:\/\/([^:]+):(\d+)\/([^# ]*)")
matchs = re.findall(par, url)
#for match in matchs:
print(matchs)

#结果
[('blog.csdn.net', '8080', 'yuekunge/article/details/14124159.html')]

([^:]+) 在https://之后 匹配到:之前的所有 也就是域名

(\d+) 匹配:之后的数字 也就是端口

([^# ]*) 匹配非#和空格的所有字符 也就是后面的资源定位

 

# 匹配王之中的url路径集合

import re

txt = u'<a href="//csdn.net/488732" title="首页" class=""><img src="//csdnimg.cn/cdn/content-toolbar/csdn-logo_.png?v=20190924.1" class="csdn-logo"></a>'' \
''<a href="//blog.csdn.net/" class="active" title="博客">博客</a>'' \
''<a class="link-title" href="//edu.csdn.net" title="学院">学院</a>'' \
''<a href="//download.csdn.net" title="下载">下载</a>'

par = re.compile(pattern=u"href=\"(\/\/[^\"]+)") 

matchs = re.findall(par, txt)
#for match in matchs:
print(matchs)

# 输出
['//csdn.net/488732', '//blog.csdn.net/', '//edu.csdn.net', '//download.csdn.net']

href=\"(\/\/[^\"]+) 匹配href="(目标匹配)  获取的目标则是在href之后所有不是终止"之间的内容,也就是url部分

 

正则匹配的形式主要是显限制字符的类型与数目,用好逻辑控制字符和()的子匹配几乎就可以用对大部分接触的简单情况。而在某些复杂的场景下,则需要定位和断言,并结合或(|)进行更为复杂的匹配,这个就后面再说。

要想学得快,还得靠动手,光学没意思,来点实践练练手

 

最后附上一个来自菜鸟的教程总结(https://www.runoob.com/regexp/regexp-syntax.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值