1、什么是正则表达式,正则表达式有什么用?
正则表达式主要是用来做字符匹配的,有一套自己的匹配规则,目前基本上所有的高级语言(Java)、脚本语言(perl)、文本编码器(txt、editplus)和办公软件(excel)都支持正则表达式。
正则表达式主要就是制定一套字符的规则,然后验证当前的字符串是否满足该规则,并且能从中提取需要的字段及信息。
如:匹配一个URL(http://www.baidu.com等)
2、正则表达式的格式
正则表达式是通过一系统的特殊字符或者符号来表示某些含义(如:数字用什么表示、字符用什么表示等)。
正则表达式包含匹配的内容及次数等:
内容:数字、字符、特殊符号(如:空格等),
重复次数:如某些字符出现多于一次、或者(0-n)次等。
位置:以什么开头,以什么结尾等;
关系符:!等(猜测) -- 目前没有看到有该用法
分组:标记某些部分的规则为一组,方便该正则表达式其它地方进行引用,可以采用下标索引方式进行引用,也可以采用取别名的方式进行引用。
3、目前正则表达式的一些用途
(1) 传统:用于一些字符的匹配,如果URL、IP地址等;
(2) 大数据:用于在ETL阶段进行数据清洗,匹配相应的字符串,并且从中提取有价值的字段或信息;
(3) 爬虫:目前爬虫进行爬取数据的时候,需要从一个网页的海量数据中匹配信息进行提取;
http://www.imooc.com/video/10506
1、正则表达式介绍
主要讲解了什么是正则表达式,正则表达式的作用以及使用的场景
(1) 正则表达式其实就是表达一个字符串的规则(比如:一个汽车有4个轮子和一个方向盘),然后验证当前的字符串是否满足这个规则(比如:根据该规则来判断该物品是否是一个洗车)。
(2) 其实该工作也可以采用传统的编码方式来实现(一般的语言都是提供一些字符串操作的函数,如:startwith(), endwith()等),但是如果采用这种编码方式不仅要针对每个规则写一些函数,而且有的字符串操作的函数还不太丰富,写起来会比较麻烦。
(3) 对一些数据的处理比较多的场景使用比较平凡,如果爬虫项目等;
2、python正则表达式之re模块1
介绍了python中的正则表达式模块re,其主要包含Pattern和Match两个模块,Pattern相当于正则表达式的规则,Match相当于正则表达式匹配字符串的结果,Match还提供了一函数,可以查看需要匹配的字符串和相应的正则表达式,并且还可以查看匹配的字符串及相应的索引等,大概的操作步骤如下:
re.compile(“正则表达式”):根据相应的正则表达式生成一个pattern对象 ;
Pattern.match(“待匹配的字符串”):根据待匹配的字符串生成一个Match对象(如果没有匹配上则结果为none);
3、python正则表达式之re模块2
主要讲解了re模块的一些相对高级的用法:
Pattern.match():还可以传入一些其它的参数,如果是否忽略大小写等;
Re.match():可以直接通过该方法生成Match对象,需要同时传入正则表达式和等匹配的字符串等。
如果需要多次使用pattern对象则可以先通过re.compile()生成Pattern对象,否则可以考虑直接通过re.match()方法生成Match对象。
4、python正则表达式语法1(匹配单个字符)
主要讲解正则表达式如何表示单个字符:
. :除/n之外的任意一个字符;
[...] :中括号中表示的是一个字符集,其含意为匹配中括号字符集中的任意一个字符;
\d / \D :表示数字[0-9] \ 非数字;
\s / \S :表示空白(space) \ 非空白;
\w / \W :表示单词(word)[0-9a-zA-Z] \ 非单词;
注意:其中的小写字母和大写字母的区别是取反的意思,小写的字母表示正常的含义,大写的字母表示在小写字母的基础上取反的意思。
个人的思考及总结:以上都是匹配单个字符的基本写法,单个字符包含(数字、字母(大小写)、特殊的字符(空白 , 、 : \n等));
类型 |
表示 |
备注 |
数字 |
\d或[0-9] |
|
非数字 |
\D或![0-9] |
此处的!是自己的猜测,应该会有关系运算符号在里面--目前没有看到有该用法 |
小写字母 |
[a-z] |
|
非小写字母 |
![a-z] |
|
大小字母 |
[A-Z] |
|
非大小字母 |
![A-Z] |
|
特殊字符 |
不知道 |
|
非特殊字符 |
不知道 |
|
还有一些相应的组合情况:如字符 |
/w或[a-zA-Z0-9] |
此处的组合应该有很多种,相信以上的基本表示都可以满足 |
5、python正则表达式语法2(字符匹配的重复次数)
以面主要讲解匹配单个字符,本次主要讲解如何表达匹配字符的次数,因为有些场景的规则下不固定字符的个数,比如说用户名(比如:只要求是6个字符以上就行了),并且正常的模式下都是贪婪型的匹配(也就是尽可能多的去匹配字符)。
表达式 |
含义 |
备注 |
* |
匹配前一个字符>=0次 |
|
+ |
匹配前一个字符>=1次 |
|
? |
匹配前一个字符0-1次 |
|
{m} / {m, n} |
{m}:匹配前一个字符m次; {m, n}:匹配前一个字符m-n次; |
|
*?(非贪婪型匹配) |
在*匹配次数的基础上尽量少的去匹配; |
|
+?(非贪婪型匹配) |
在+匹配次数的基础上尽量少的去匹配; |
|
注意:组合使用的时候,通过?表示非贪婪模式,及表示在?前面一个字符表示的匹配次数据的基础上尽量少的次数的去匹配。
6、python正则表达式语法3(边界和分组)
(1) 边界
有时候需要固定字符串匹配以什么开头,或者以什么结尾,所以有边界,其实也就正则表达式规定匹配的位置。
表达式 |
含义 |
备注 |
^ |
字符串以什么开头 |
不是仅仅指第一个字符,其含义就是匹配的结果为这个字符串开头 |
$ |
字符串以什么结尾 |
同上 |
\A / \Z |
开头 / 结尾 |
同上 |
说明:位置只有开头和结尾两个,默认只要字符串匹配上就行,有可能在中间位置。
(2) 分组
在正则表达式匹配的过程中,可能有些部分的规则是一样的,在写正则表达式的时间没有必要再把这一部分规则再写一次。所以正则表达式引入了分组的概念。
表达式 |
含义 |
备注 |
| |
表示或 |
a|b:表示在该位置匹配a字符或者b字符 |
(ab) |
括号内的内容表示一个分组 |
|
\ |
可以分组的索引号引用该分组 |
如:\1 |
(?P |
表示给该分组取的别名 |
|
(?P=name) |
表示引用该分组的内容 |
与\ |