正则表达式入门
正则表达式一直都是我畏惧的知识点,之前也尝试着学习,但最终还是放弃了。由于正则在项目中经常能用的到,所以最近强迫自己花空闲时间学习了些简单的正则知识,并将了解到的知识总结在本文中,希望对大家有所帮助。大家在学习正则的时候不要有畏惧的心理,其实正则入门还是比较容易的。
一、简介
正则表达式是由原意文本字符(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分钟入门教程
4145



被折叠的 条评论
为什么被折叠?



