正则表达式入门
正则表达式一直都是我畏惧的知识点,之前也尝试着学习,但最终还是放弃了。由于正则在项目中经常能用的到,所以最近强迫自己花空闲时间学习了些简单的正则知识,并将了解到的知识总结在本文中,希望对大家有所帮助。大家在学习正则的时候不要有畏惧的心理,其实正则入门还是比较容易的。
一、简介
正则表达式是由原意文本字符
(a,b,c,1,2,3等)和元字符
( . * ? 等)组成来匹配指定内容的表达式。
原意文本字符
原意文本字符是正则中最基本的字符,比如:
a
在正则中表示匹配a
这个字符;1
在正则中表示匹配1
这个字符;我
在正则中表示匹配我
这个字符。
元字符
指在正则表达式中有特殊含义的专用字符,比如:
- “.”表示匹配除换行\n以外的所有字符;
- “*”表示匹配前面的子表达式0次或多次;
- “?”表示匹配前面的子表达式1次或多次。
常用的元字符:
元字符 | 含义 | 举例 |
---|---|---|
\ | 转义字符,将后一个字符标记为特殊字符或将元字符转为原意字符 | 1、\\ 表示匹配原意字符\ ;2、 \. 表示匹配英文句号“.”;3、 \d 表示匹配数字。 |
. | 匹配除换行(\n)以外的所有字符 | abc. 能匹配到“abc”后面的那个字符,比如“abc”后面的空格、字母、数字、汉字等 |
^ | 匹配字符串的开始位置,在集合([] )中表示“非” | 1、^\d\d\d 能匹配“123”、“666”等,但不能匹配“a123”、“b123”、“-123”等;2、 ^\w+\b 表示匹配第一个单词;3、 [^ajl] 匹配除了“a”、“j”、“l”以外的任意字符。 |
$ | 匹配字符串的结束位置 | ^\d\d\.\d\d$ 能匹配“12.01”和“00.00”等,但不能匹配“0.00”、“12.0”、“123.00”等 |
? | 匹配前面子表达式0次或一次 | good? 可以匹配“goo”和“good”等,但是不能匹配“go”等 |
+ | ||
* | 匹配前面子表达式0次或多次 | zo* 能匹配“zo”、“zoo”、“zooo” |
() | 标记一个子表达式的开始和结束位置,其结束符号“)”是元字符 | |
[ | 字符组的起始符号,其结束符号“]”不是元字符 | |
{ | 标记限定符的开始,其结束符号“}”不是元字符 | |
| | 表示“或” | 1、a|b|c 匹配“a”、“b”、“c”之中的一个; |
如果要匹配元字符本身可以用\
来取消元字符的特殊含义,比如\.
匹配英文句号”.”;\*
匹配“*”本身;\+
匹配“+”本身……
常用表达式举例
表达式 | 含义 | 举例 |
---|---|---|
\w | 匹配字母、数字、下划线 | abc\w 表示匹配“abc”开头并且后面跟着一个字母或数字或下划线的字符串 |
\W | 匹配非字母、非数字、非下划线 | \W 相当于[^\w] |
\d | 匹配数字 | \d\d\d 表示匹配3个连续的数字 |
\D | 匹配非数字 | \D 相当于[^\d] |
\b | 匹配单词的开始或结束 | \bgo\w*\b 表示匹配“go”开头的一个单词 |
\B | 匹配非单词的开始或结束 | \B 相当于[^\b] |
\s | 匹配任何空白字符,如回车、空格、制表符等 | \s 相当于[\f\n\r\t\v] |
\S | 匹配任何非空白字符 | \S 相当于[^\s] |
{n} | 匹配前面子表达式n次 | \d{11} 表示匹配连续的11个数字 |
{n,m} | 匹配前面子表达式n到m次 | \d{7,11} 表示匹配连续的7-11个数字 |
{n,} | 匹配前面子表达式n次以上 | \d{5,} 表示匹配连续的5个以上的数字 |
[xyz] | 表示字符集,匹配所包含的任意一个字符 | 1、[abc] 能匹配“a”或“b”或“c”;2、 [!?*.] 表示匹配“!”、“?”、“*”、“.”中的任意一个;3、 [^0-9] 匹配所有非0到9的字符,相当于\D 。 |
[a-z] | 表示字符范围,能匹配范围内的任意一个字符 | 1、[a-z] 能匹配26个小写字母中任意字母;2、 [0-9] 能匹配0到9的任意数字,和\d 一样的效果;3、 [1-9] 能匹配1到9的任意数字;3、[\u4e00-\u9fa5] 能匹配所有汉字。 |
(abc) | 组合,将几个项组合成为一个单元,可以对这个单元使用限定符 | (\.[a-z]+)+$ 可以匹配“.com”、“.net”、“.com.cn”等结尾的字符 |
运算符优先级
正则表达式是从左向右进行运算的,并遵循优先级顺序。优先级顺序如下表(先高后低):
运算符 | 优先权 | 说明 |
---|---|---|
\ | 最高 | 转义字符 |
() (?:) (?=) [] | 高 | 圆括号和方括号 |
* + ? {n} {n,} {n,m} | 中 | 限定符 |
^ $ \任何元字符 任何字符 | 低 | 定位点和序列(即:位置和顺序) |
| | 最低 | 选择符“或” |
二、简单使用
了解了正则表达式的基本语法后,我们就可以牛刀小试了,好记星不如烂键盘,多敲几遍就就不容易忘记,下面我们通过实例进行学习(注:正则比较灵活,没有标准的表达式,以下所有表达式仅供参考!)。
在编写正则时可以在站长工具进行正则测试
验证(^$)是否为手机号(中国)
分析:由于号码段在不断更新,本文只验证“13”、“15”、“17”、“18”开头后面有9个数字的号码(如表达式1),大家可以根据自己的需求灵活修改(如表达式2)。
表达式1:^(13|15|17|18)\d{9}$
表达式2:^(13[0-9]|15[0-9]|17[07]|18[05689])\d{8}$
验证(^$)是否为电话号码(中国)
电话号码一般为“区号[-]号码
”的格式,如果区号
部分是3位则号码
部分为8位,如021-67678989、02167678989;如果区号
部分是4位则号码
部分是7位,如0765-6767676、02167678989。
表达式1:^\d{3}-?\d{8}|\d{4}-?\d{7}$
表达式2:^(\d{3}-?\d{8})|(\d{4}-?\d{7})$
(由于选择符“|”优先级最低,所以组合符号“()”加与不加都行)
验证(^$)是否为邮箱
邮箱一般为“名称@域名
”的格式,由于名称
部分格式太多(有些邮箱名称允许有中文)不好限制,所以本文只验证名称和域名有“英文字母
”、“数字
”、“下划线
”、“中划线(-)
”、“英文句号(\.)
”的邮箱。
\w
可以匹配“英文字母、数字、下划线”\.
可以匹配英文句号“ . ”-
可以匹配原意字符“ - ”本身@
可以匹配原意字符“ @ ”本身([\.-]\w+)
可以匹配“ photo-google ”中的“ -google ”、“ photo.google ”中的“ .google ”(\.[a-zA-z0-9-]+)+
可以匹配“ .com ”、“ .com.cn ”等
表达式:^\w+([\.-]\w+)*@[\w-]+(\.[a-zA-z0-9-]+)+$
验证(^$)是否为身份证号码(中国)
身份证号码是由18个字符组成,前17个必须为数字(\d
),第一位不能为0([1-9]
),最后一位可能是数字(\d
)也可能是“x/X”([xX]
)。
表达式:^[1-9]\d{16}[\dxX]$
匹配HTML中的a标签的链接
a标签类似为“<a href="http://www.google.com/hk" target="_blank" >Google香港</a>
”
但是也可能会有如下等特殊的情况:
<a href='http://www.google.com/hk'>Google香港</a>
<a target="_blank" href="http://www.google.com/hk">Google香港</a>
<a href ="http://www.google.com/hk">Google香港</a>
经过分析得出如下表达式:
表达式:<a[^>]+href[\s]*=[\s]*['"]([^"']*)['"]
匹配HTML中的img标签的图片地址
匹配img标签和匹配a标签类似,只是标签名称和资源属性不同。
表达式:<img[^>]+src[\s]*=[\s]*['"]([^"']*)['"]
python 正则表达式去除文本中标签内容
print re.sub("<[^>]*>","",text) 输出正确结果,而 print t.replace("<[^>]*>","")不能输出正确结果
import re
t = "<text>jsdkjfsgn</text>"
print `re.sub("<[^>]*>",""`,t)
print t.replace("<[^>]*>","")
三、总结说明
本文只是入门教程,让你学习完后能使用基本的表达式进行匹配。如果学习正则的时候遇到问题,可以阅读下面的“参考文档”,这些文档写的非常详细,语言也更加严谨。由于本人也是刚学正则,文章里有错误的地方欢迎大家指正。
参考文档
1、维基百科——正则表达式
2、正则表达式 - 语法
3、正则表达式30分钟入门教程