正则表达式快速入门

Published
2022-09-12
浏览次数 :  487

正则表达式是大号的通配符,是帮你匹配指定规则的字符串。网站上用到的表单会用到正则来判断密码的复杂程度,爬虫中可以用正则表达式提取需要的信息。

注意,正则表达式中没空格,或者空格也是被匹配的,要十分注意空格!

正则表达式

. 句号代表任何字符。

regex101.com这网站可以让你在线测试正则表达式。

限定符 ?

?是限定符,表示前面这个字符需要出现0次或者1次。就是表示前面这个字符可有可无。比方说搜索are? 就是表示e可有可无,就会搜索到are或者ar的全部内容。

限定符 *

匹配0个或者多个字符。 比方说输入ab*c , *号表示b可以没有,也可以多次,结果就是abbbbbbbbc 或者ac , abc 等 。 表达式中可以出现0个或者多个前面字符。

限定符 +

限定符 + 号可以匹配 出现1次以上的字符。 比方说ab+c,就可以匹配 abc 或者abbc abbbc abbbbbc 等。匹配加号前面字符一次或者多次的字符。

{}

使用大括号可以设置使用范围,比方说ab{6}c。 比方说我们希望字符出现次数是2到6之间, ab{2,6}c 这样就会搜索abc 带b字符2到6个范围的字符。 如果希望字符出现字数2次以上,直接可以省略后面的6,ab{2, } c

如果想匹配多个字符怎么办?用小括号( ), 比方说我们想匹配ab或者abc, 我们可以先把ab括号括起来,(ab)+ , 然后后面添加限定符+,就可以看到正则表达式成功匹配。 (ab)+ 就可以匹配到字符里面包含ab一次或者多次的全部字符,

或 OR 的运算, 运算符 |

如果要匹配 a cat 或者 a dog, a (cat|dog) ,首先正则表达式会匹配a空格,然后匹配后面是cat或者dog的内容。

与或相关的字符类

如果我们想要匹配由abc这几个字母构成的单词,我们可以用中括号括住abc 然后最后添加限定符+ . [abc]+ 。

[ ] 中括号里面的字符代表要求匹配的字符只能取自于他们。另外我们可以在中括号里指定字符的范围。比方说[a-z]+代表所有的小写英文字符。 [a-zA-Z]+ 代表所有的英文字符,[a-zA-Z0-9]+ 代表所有字符和数字。

如果在前面添加一个脱字符,^ ,则代表要去匹配^后面列出的以外的字符,比方说[^0-9]+ 就可以列出所有非数字字符包括换行符。

正则表达式已经包括了一系列常用的字符类型,我们称作元字符。

\

大多数元字符都是以反斜杠开头 \ 。

\d 代表数字字符,等于上面的[0-9]+

\w 代表单词字符,也就是所有的英文字符,数字加上下划线。

\s 代表空白符,包括tab和换行符。

\D 代表非数字字符,

\W 代表非单词字符

\S 代表非空白字符

\b 单词分界处

句号也是特殊字符,代表任意字符但是不包含换行符。 .*

^匹配行首,$美元符号匹配行尾。 ^a 只会匹配行首的a . a$只会匹配行尾的a。

贪婪与懒惰匹配

*+{}在匹配字符串的时候默认会去匹配尽可能多的字符,比如我们想匹配代码里的Html标签,

比方说我们要去匹配下面的Html标签,用<.+>去匹配的时候,会匹配到整个字符串,因为.+ 会匹配尽可能多的字符,. 代表任意字符

<span><b>this is regex code</b></span>

解决方法很简单,在加号后面加个问号就好了。

<.+?> 就能匹配到所有的Html 标签,它会把表达式中默认的贪婪匹配切换到懒惰匹配。

实例:

匹配所有16进制的RGB颜色值,

首先匹配前面#号,接下来因为每个颜色字符都是16进制,因此他们只能取自于a-f之间或者大写的A-F或者0-9。 并且字符一定要出现6次。最后在末尾加上\b来代表单词字符的边界,这样可以避免不符合要求的文本被匹配。

[a-fA-F0-9]{6}\b

实例二:匹配ip地址范围

ip地址由四段数字组成,中间用句号隔开,如果要在文本中提取所有出现的ip地址,我们可以直接使用\d+.\d+.\d+.\d+ ,\d+会匹配任何长度大于1的数字。 但是因为句点. 在正则中有特殊含义, 所以需要用反斜杠\ 来做转义。

但是ip地址是特定单位段,ip地址每部分都是8位的数字,不能超过255,所有我们需要用到下面的逻辑:

如果每段前两位是25那么最后一位只能取0-5的数字或者如果第一位是2第二位是0到4之间数字那么最后一位可以取0-9 可以直接用\d ,如果第一位是1那么最后一位可以取00-99任何数字,用\d\d代替。但是Ip地址也可以有两位甚至一位数字构成,因此我们可以在第一个数字或者第三个数字后面都加一个问号,这样可以表示第一个数字和第三个数字都可有可无的匹配。

然后我们匹配后面的句点,\. 之后将全部表达式括起来, 重复三次

((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}25[0-5]|2[0-4]\d|[01]?\d\d?

这样就会匹配ip地址前三段,并且包含每段最后的句点。因为最后一段没有句号所以无法匹配4次,至于最后一段数字,只需要将 前面部分不带句号复制过去即可。

总结: 、

其他好的正则表达式教程:


Top