正则表达式里面最简单的部分,30分钟看懂并上手使用
首先搞明白正则表达式是什么,是用来干什么的
相信大家使用word的时候,会使用ctrl+F打开查找功能吧,其实这个正则表达式就是更高级的ctrl+F查找,在word里面的ctrl+F,你只能查找简单的字符串,也就是脑子里想到哪个东西去查哪个东西,想查找单词hello,那么就输入hello,word自动会帮你找到所有的hello,但是在某些场合下,我们需要查找更加复杂规则的东西,比如一次性找出类似010-213213,010-244698的号码,显然你靠word的ctrl+F是没法查出来这些全都不一样的号码的,这时候正则表达式就派上用场了,它是描述上面这么一串电话号码规则的一个表达式,比如约定\d表示单个数字字符,那么查找\d\d\d-\d\d\d\d\d\d就能把上面那些号码全部查找出来。
正则表达式当然不仅仅是用来查找电话号码的一个表达式,它是描述一串字符的表达式,后面我们学习的就是它是如何来描述各种更加复杂规则的字符串
一个正则表达式学习软件
使用方法:先把原始字符串复制到源文本一栏, 然后把要匹配的表达式填写到模式一栏,
最后点击运行,匹配结果会在右边结果栏显示
反斜杠\
的含义及其用法
符号 | 含义 |
---|---|
\d |
数字字符集 |
\w |
单词字符集 |
例1:
\d
就是表示集合{0,1,2,3,4,5,6,7,8,9},匹配的时候,一个一个字符扫描,如果字符属于这个集合,就把这个字符拿出来
例2:
\d\d\d\d
表示连续4个属于数字集合的字符
例3:
\w
表示属于{数字,字母,下划线,中文汉字}的单个字符
说明:我们在学习的时候,完全忽略中文汉字,仅仅以纯英文文本作为理解,也就是文本字符串里面只有数字,字母,标点,特殊符号
中括号的用法
一句话概括为:自定义字符集,就是你理解的数学中的集合的含义,但是正则表达式里面的集合
不用花括号,用中括号,比如下面几个例子
符号 | 含义 |
---|---|
[23查找] | 表示属于集合{2,3,查,找}的一个字符 |
符号 | 含义 |
---|---|
[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9] |
就是数字数字数字-数字数字数字数字数字数字 |
有人会问了,我靠,[0-9]
不应该是{0,-,9}这三个字符的集合吗,怎么就表示0-9这些数字的集合呢,说到这里,就要提一下中括号里面的3个特殊字符,这三个字符具有特殊含义,不是原本的含义了
符号 | 含义 |
---|---|
反斜杠\ |
转义字符,比如\d表示数字字符 |
短横线- |
连接在数字中间或者字母中间,表示范围,否则就是原本的- 字符 |
尖帽子^ |
在中括号外面是边界字符,在中括号里面表示反义,先别理会,后面会讲 |
如何输出上面3个特殊字符,很简单,前面再加个反斜杠转义字符就行了,另外短横线,只要不是在数字字母中间,就是原本的含义
中途小结,以及容易混淆的东西说明
首先单个反斜杠和中括号虽然表示的是字符集合,但是你写一个,表示匹配在这个字符集里面的一个字符,前面我们匹配电话的时候,就需要反复写
其次,不管那些字符是否有特殊含义,你加个转义字符,它就是它自己了,没有特殊含义了
有了字符集的表示方法,我们能查找的东西一下子变的非常多,比如
\d[qwer]
就能找出 2q , 7w , 9e 这些东西,\d
有10种,[qwer]有4中,那么
这个表达式就能匹配40种,所以它比ctrl+F的查找更加强大
更强大的功能——数量限定符 加乘问花括号
符号 | 含义 |
---|---|
+ | 匹配大于等于1个某字符 |
* | 匹配大于等于0个某字符 |
? | 匹配0或1个某字符 |
{} | 匹配指定数量的某字符 |
使用方法说明:
虽然有了字符集这么一个强大的表示方法,我们可以根据自己的需求可以随意组合,但是碰到像前面电话号码010-213213,010-244698 这么有规律的字符串,我们用字符集按照电话号码的格式使劲写长长的一大串,有点繁琐,另外有时候电话号码长度不一致的时候,比如123-4324 ,(000)2354也在里面,我们如果按照字符集的表达方法,只要长度不一样,我们就得写好几个正则表达式才能表示这4串号码,所以有4个字符可以对字符直接作数量限制,具体含义直接看下面的例子
接下来要讲什么?
前面已经讲解了反斜杠,中括号,4个数量限定符的用法,你观察一下键盘,发现还有好多字符对不对,可能里面还有一半的字符都有其特殊含义(表示原字符,也就是字符的原本含义,需要前面加反斜杠,前面已经讲了),但是如果掌握了上面反斜杠,中括号,4个数量限定符的用法,实际上你已经能做很多事情了。
举个例子,对于IMDB电影评论数据集,里面收集了几万用户对电影的评论的句子,句子里面有中英文单词,空格,标点符号,特殊字符,我们做数据的时候,只要里面的单词,那么如何把单词全部找出来呢,其实[a-zA-Z]+
就能把所有的单词抽出来,这个表达式表示大于等于1个字母的字符串,其实就是单词了,注意,
这里说的单词和上面讲的\w
表达的单词不是一个定义,这里讲的单词就是你在英语词典里能找到的单词,而前面讲的\w
是正则表达式里面单词字符集{数字,字母,下划线,中文}中的一个字符,如果想表示多个,\w+
就可以提取出mike_1998这种“单词了”,再强调一遍,\w
单个只能一次提一个字符,然后不停这样提取,提取出来的是m,i,k,e,_,1,9,9,8这种
有了上面的认识,后面如果需要更复杂的再去查表即可,后面再补充三个东西:
第一个东西很简单,就是键盘上反斜杠那个键上面的竖线|
,这个符号就是正则表达式里面的条件表达式,比如你写了一个 正则表达式1|
正则表达式2 ,就会找符号表达式1或2的字符串,拿前面电话号码的例子来说,如果你很难一次性编写出符合所有电话号码规则的表达式,你就分开写,再用竖线分隔写出来就行。有了前面的例子解释,这里就不写了,你自己有兴趣拿上面的软件试一试。
第二个东西就是反义,反含义,比如非数字用[^0-9]
表示,但是这个尖帽子符号如果写在中括号外面,它表示边界限定符号,就是第三个要讲的东西,但是我们就不拿尖帽子举例了,换个简单的来举例子
第三个东西:边界限定符,比如\b
它表示什么字符集的一个字符呢?答案很奇怪,它不表示任何字符,而是表示一个不存在的字符,这个字符需要你在脑子里抽象画出来,然后匹配的时候去看,由于还没讲例子,你肯定不清楚我上面在讲什么,因为我虽然讲了它不表示任何字符,但是它要怎么匹配我还没说,具体它要怎么匹配,要在例子里面说明,见下图
通过上面两个例子对比,我们就知道了\b
的作用,它出现在单词字符的某一边,就是给单词某一边的字符加了一个限制条件,也就是给单词的边界下了一条规则,这就是边界匹配符。由于边界匹配符还有好几个,并且其含义说的不太像人话,这里就不提了。
Python中的正则表达式模块
import re
patten=re.compile(r”正则表达式”)
data=re.findall(patten,原始字符串)
上面先用compile把你写的正则表达式编译成re模块能识别的东西,不要管,接着使用findall找到
符合正则表达式的所有字符串,返回一个列表给变量名data
字符串的替换与修改如下:
re.sub(patten,”你要替换成什么在这里写”,原始字符串)
不要管返回值了,反正就这么替换了,简而言之就是python字符串replace方法的加强版