以python为例,列举一些常用的正则表达式用法。
一
[] :在正则表达式中,[]表示满足括号中任一字符。比如“[hi]”,它就不是匹配“hi”了,而是匹配“h”或者“i”。
如果把正则表达式改为“[Hh]i”,就可以既匹配“Hi”,又匹配“hi”了。
r :是raw的意思,它表示对字符串不进行转义。
. :在正则表达式中表示除换行符以外的任意字符。比如当文本是:
Hi, I am Shirley Hilton. I am his wife.
用“i.”去匹配,会得到[‘i,’, ‘ir’, ‘il’, ‘is’, ‘if’]。
*:它表示前面的字符可以重复任意多次(包括0次),只要满足这样的条件,都会被表达式匹配上。
二
如果要匹配数字,我们可以用[0123456789]。
由于它们是连续的字符,有一种简化的写法:[0-9]。类似的还有[a-zA-Z]的用法。
要表示任意长度的数字,就可以用[0-9] *或者\d *。
但要注意的是,*表示的任意长度包括0,也就是没有数字的空字符也会被匹配出来。一个与 * 类似的符号+,表示的则是1个或更长。
所以要匹配出所有的数字串,应当[0-9]+或者\d+。
如果要限定长度,就用{}代替+,大括号里写上你想要的长度。比如11位的数字:\d{11}。
想要再把第一位限定为1,就在前面加上1,后面去掉一位:1\d{10}。
除了*、+、{}来表示字符的重复。其他重复的方式还有:
? - 重复零次或一次,{n,} - 重复n次或更多次,{n,m} - 重复n到m次
正则表达式不只是用来从一大段文字中抓取信息,很多时候也被用来判断输入的文本是否符合规范,或进行分类。例如:
^\w{4,12}$
这个表示一段4到12位的字符,包括字母或数字或下划线或汉字,可以用来作为用户注册时检测用户名的规则。
\d{15,18}
表示15到18位的数字,可以用来检测身份证号码。
^1\d*x?
以1开头的一串数字,数字结尾有字母x,也可以没有。有的话就带上x。
三
一些常用的元字符有:
\w - 匹配字母或数字或下划线或汉字。
\s - 匹配任意的空白符。
^ - 匹配字符串的开始。
$ - 匹配字符串的结束。
\S其实就是\s的反义,任意不是空白符的字符。同理,还有:
\W - 匹配任意不是字母,数字,下划线,汉字的字符。
\D - 匹配任意非数字的字符。
\B - 匹配不是单词开头或结束的位置。
[a]的反义是 [^a] ,表示除a以外的任意字符。 [^abcd] 就是除abcd以外的任意字符。
四
如果有以下手机号:
(021)88776543
010-55667890
02584453362
0571 66345673
一个可以匹配出以上所有结果的表达式是:
\ (?0\d{2,3}[) -]?\d{7,8}
\ (?:()在正则表达式里也有着特殊的含义,所以要匹配字符"(“,需要用”(“。?表示这个括号是可有可无的。
0\d{2,3}:区号,0xx或者0xxx。
[) -]?在区号之后跟着的可能是”)“、” “、”-",也可能什么也没有。
\d{7,8}:7或8位的电话号码。
符号总结
常用的元字符
符号 | 用法 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
常用的反义字符
符号 | 用法 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^a] | 匹配除了a以外的任意字符 |
[^abcd] | 匹配除了abcd这几个字母以外的任意字符 |
常用的限定字符
符号 | 用法 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,} | 重复n到m次 |
常用分组符号
符号 | 用法 |
---|---|
(a) | 匹配a,并捕获文本到自动命名的组里 |
(? < b > a) | 匹配a,并捕获文本到名称为b的组里,也可以写成(?'b’a) |
(?:a) | 匹配a,不捕获匹配的文本,也不给此分组分配组号 |
(?=a) | 匹配a前面的位置 |
(?=a) | 匹配a后面的位置 |
(?!a) | 匹配后面跟的不是a的位置 |
(?<!a) | 匹配前面不是a的位置 |
常用懒惰匹配限定符
符号 | 用法 |
---|---|
*? | 重复任意次,但尽可能少重复 |
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |
贪婪匹配:正则表达式中包含重复的限定符时,通常的行为是匹配尽可能多的字符。
懒惰匹配:匹配尽可能少的字符。