正则表达式基础(1)
目录
1.空白元字符
元字符 | 说明 |
[ \b ] | Backspace键 |
\f | 换页符 |
\n | 回车符 |
\r | 换行符 |
\t | Tab键 |
\v | 垂直制表符 |
\b表示两个字符时,是匹配单词边界,之前遇到过要匹配单词,需要 r'\b加以说明.
回车和换行符感觉功能是一样的,查看一些资料表示有一些解释器会将 \r 自动转换为 \n, 正则表达式\r\n匹配一个“回车换行”组合,windows系统把这个组合用作文本结束标签,Unix和Linux只使用一个换行符结束一个文本行,匹配时候用\n\n即可,不应加上\r.
2.特定字符匹配
元字符 | 说明 |
\d | 任何一个数字字符(等价于[0-9]) |
\D | 任何一个非数字字符(等价于[^0-9]) |
\w | 任何一个字母字符或下划线字符(即[a-zA-Z0-9_]) |
\W | 任何一个非字母字符或非下划线字符(即[^a-zA-Z0-9_]) |
\s | 任何一个空白字符 |
\S | 任何一个非空白字符 |
字母的大小写匹配相反的字符.
3.匹配十六进制和八进制数值
在正则表达式中,十六进制数值要用前缀\x,如\x0A对应ASCII字符10(换行符),效果等于\n,八进制前缀则是\0,如\011对应ASCII 9(制表符)
1. \字符常用于转义,如上面列举的字符匹配,当文本需要匹配本身\时,用\\
2. .字符可以匹配任何单个字符、字母、数字,甚至本身
3. +字符匹配一个或多个字符,放在一个字符或字符集之后,匹配与前面意义相同的字符
4. *字符匹配0个或多个字符,用法类似'+',只是匹配的前面字符可以不出现
5. ?字符匹配他前面的字符是否存在,如匹配URL时,有http和https,正则表达式https?
6. @、-字符用时无须转义
有了上面的字符功能的介绍,重复匹配我们可以用+或*,但是有局限性,不能限制重复次数,所以要给它设定精确的次数,这时用到{},比如要找出网页中RGB值,文本是:
<body bgcolor = "#336655" text = "#FFFFFF">
正则表达式:#[0-9a-fA-F]{6} 结果:#336655 #FFFFFF
例子重复匹配为6次,那如果要检查日期的书写格式如:2005/01/01、2006-1-10、19.08.15、18 8 8,最后一个不符合要求,年份至少要两位数,这就需要设定最少和最多重复次数,
正则表达式为:\d{2,4}[\/-\.]\d{1,2}[\/-\.]\d{1,2} 结果最后一个不符合就没有匹配到,检查完成。
虽然我们已经能够限定匹配重复次数,但是还有一种情况,一个网页里面的各种标签不止出现一次,例如要找出<a></a>里面的内容:文本:
<a>网页</a><a>新闻</a><a>贴吧</a><a>知道</a><a>音乐</a><a>图片</a><a>视频</a><a>地图</a><a>文库</a>
正则表达式:<a>.*</a> 匹配结果是整一串,<a>网页</a><a>新闻</a><a>贴吧</a><a>知道</a><a>音乐</a><a>图片</a><a>视频</a><a>地图</a><a>文库</a>,而我们理想是每个标签都会分开
修改为:<a>.*?</a> 结果显示9个匹配:<a>网页</a>、<a>新闻</a>、<a>贴吧</a>、<a>知道</a>、<a>音乐</a>、<a>图片</a>、<a>视频</a>、<a>地图</a>、<a>文库</a>
+、*都是“贪婪型”元字符,在匹配行为模式上是多多益善而不是适可而止,所以它的“懒惰性”版本则尽可能短的匹配,式子后加上?
1.URL地址
<a href="https://www.baidu.com/" nslog="normal" nslog-type="10600112" data-href="https://www.baidu.com/s?ie=utf-8&fr=bks0000&wd=">网页</a> <a href="http://news.baidu.com/" nslog="normal" nslog-type="10600112" data-href="http://news.baidu.com/ns?tn=news&cl=2&rn=20&ct=1&fr=bks0000&ie=utf-8&word=">新闻</a> <a href="https://tieba.baidu.com/" nslog="normal" nslog-type="10600112" data-href="https://tieba.baidu.com/f?ie=utf-8&fr=bks0000&kw=">贴吧</a> <a href="https://zhidao.baidu.com/" nslog="normal" nslog-type="10600112" data-href="https://zhidao.baidu.com/search?pn=0&&rn=10&lm=0&fr=bks0000&word=">知道</a> <a href="http://music.baidu.com/" nslog="normal" nslog-type="10600112" data-href="http://music.baidu.com/search?f=ms&ct=134217728&ie=utf-8&rn=&lm=-1&pn=30&fr=bks0000&key=">音乐</a> <a href="http://image.baidu.com/" nslog="normal" nslog-type="10600112" data-href="http://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=">图片</a> <a href="http://v.baidu.com/" nslog="normal" nslog-type="10600112" data-href="https://www.baidu.com/sf/vsearch?pd=video&tn=vsearch&ie=utf-8&rsv_spt=17&wd=">视频</a> <a href="http://map.baidu.com/" nslog="normal" nslog-type="10600112" data-href="http://map.baidu.com/m?ie=utf-8&fr=bks0000&word=">地图</a> <a href="https://wenku.baidu.com/" nslog="normal" nslog-type="10600112" data-href="https://wenku.baidu.com/search?lm=0&od=0&ie=utf-8&fr=bks0000&word=">文库</a>
正则表达式:https?://[\w.]+.com
2.电子邮件地址
My QQ mail is 12345@qq.com, and another mail is abcde@126.com
正则表达式:(\w+)*@\w+\.com
在实际运用正则表达式中,很多需要根据文本特点写出最合适简单的式子,比如爬取网页的目标信息,一个好的正则表达式能帮我们简单地解决问题。