目录
简介
正则表达式(regular expression,简称regex)是一些用来匹配和处理文本的字符串。正则表达式语言并不是一种完备的语言,他是内置于其他语或软件产品里的“迷你”语言。正则表达式的使用无非两种情况:一种是查找特定的信息(搜索),另一种是查找并编辑特定的信息(替换)。学习正则表达式对我们理解爬虫很有帮助。本文是学习美国知名技术作家Ben Forta编写的《Sam Teach Yourself Regular Expression in 10 Minutes》的中文翻译版《正则表达式必知必会》的学习笔记。书中提供的正则表达式测试工具的链接如下:http://www.forta.com/books/0672325667/.
常用字符及其说明
字符 | 说明 | 用法举例 |
. | 可以匹配任何单个的字符(除了换行符) | |
[] | 用来定义字符集合,字符集合中可以使用连字符-来简化字符区间的定义, 连字符按照ASCII码顺序来计算区间 | [Aa]表示匹配文本中的A或a一次 [0123456789abcd]可简化为[0-9a-d] |
^ | 取非字符 它作用于给定的字符集合里所有字符,而不是紧跟其后的一个字符 | [^0-9a-z]表示不匹配数字字符和小写字母字符 |
\ | 转义字符,任何一个元字符都可以通过在其前加一个\将其转义,配对的元字符不用做元字符时必须转义如[],有时候喜欢把转义字符加上字符集合 [\n]增加代码的可读性 | \.表示.本身 \\ 表示\本身 |
用法示例:
匹配文本 | 正则表达式 | 匹配结果 | 说明 |
cat cap Cam Cat | ca. | cat cap Cam Cat | 匹配ca连接任意一个字符的字符串 |
cat cap Cam Cat | [Cc]a. | cat cap Cam Cat | 匹配时c不分大小写,即在匹配时选取C和c中的一个 |
a b c 1 2 3 4 5 | [^1-4] | a b c 1 2 3 4 5 | 匹配时不匹配1-4这几个数字 |
cat[]125 | \[\] | cat[]125 | 将[ 和]转义,否则不能够匹配到 |
常用字符匹配
正则表达式 | 匹配对象 | 等价表达式 |
\d | 数字 | [0-9] |
\D | 非数字 | [^0-9] |
\w | 字母和数字或下划线 | [a-zA-Z0-9_] |
\W | 非字母和数字或下划线 | [^a-zA-Z0-9_] |
\s | 空白字符 | [\f\n\r\t\v] ([\b] 除外) |
\S | 非空白字符 | [^\f\n\r\t\v] |
用法示例:
匹配文本 | 正则表达式 | 匹配结果 | 说明 |
abc123def | \d\d\d | abc123def | 匹配三个连续的数字字符 |
abc123def | \D\D\D | abc123def | 匹配三个连续的不是数字的字符 |
abc-+defg | \w\w\w | abc_+defg | 匹配四个连续的字母、数字或下划线 |
abc_+defg | \W | abc_+defg | 匹配一个非字母和数字或下划线 |
abc def gh | \s | abc def gh | 匹配到空格字符(这里没法显示) |
abc def gh | \S\S\S | abc def gh | 匹配三个连续的非空白字符 |
空白元字符
正则表达式 | 匹配对象 |
\n | 换行符 |
\r | 回车符 |
\t | 制表符(Tab) |
\v | 垂直制表符 |
\f | 换页符 |
[\b] | 回退键 Backspace |
\r\n | 匹配一个 回车+换行 组合 (windows系统下) |
重复匹配
元字符 | 说明 | 用法举例及说明 |
+ | 匹配至少一个或者多个字符,给字符或者字符集合加上+的后缀(放在字符集合的后面),表示匹配同一个字符的多次重复 | \w+ 表示多次(至少一次)匹配字母和数字或下划线 [01]+ 表示多次匹配(至少一次)0或1 |
* | 匹配一个字符连续出现零次或多次的情况 | 用法同+,但不同的是匹配的字符可有可无,可以理解为在*前面的字符是可选的 |
? | 匹配一个字符的零次或者一次出现 | https? 表示s可以出现0或1次,它的匹配对象是https或http |
匹配文本 | 正则表达式 | 匹配结果 | 说明 |
abc+123@345 | \d+ | abc+123@345 | 匹配多个(至少一个)连续的数字字符 |
* | 用法同+,不同的就是匹配的字符可以不出现 | ||
https://www.bilibili.com http://www.bilibili.com | https? | https://www.bilibili.com http://www.bilibili.com | s后加?表示s可以出现0或1次 |
注:[0-9+]表示数字0-9和+的构成的字符集合(类似的还有.)。即在字符集合中,+表示加号本身,而不是重复匹配的元字符。
匹配重复次数
如果想给匹配的重复次数设定一个精确值,在{}加上确定的数字
匹配文本 | 正则表达式 | 等价表达式 | 匹配结果 | 说明 |
abc+123@345 | \d{3} | \d\d\d | abc+123@345 | 表示模式里前一个字符或字符集合(这里是数字)必须出现3次才算是一个匹配 |
设定区间
匹配文本 | 举例 | 匹配结果 | 说明 |
abc+12@3345-245 | \d{2,4} | abc+12@3345-245 | 表示数字字符至少重复两次,最多重复四次才算是一个匹配 |
abc+12@3345-245 | \d{3,} | abc+12@3345-245 | 表示数字字符至少重复3次才算是一个匹配 |
贪婪型与懒惰型
贪婪型的元字符,它们在匹配时往往是多多益善。
懒惰型(非贪婪型)元字符是在贪婪型其后加上?
贪婪型元字符 | 懒惰型元字符 |
* | *? |
+ | +? |
{n,} | {n,}? |
用法示例:
类型 | 匹配文本 | 正则表达式 | 匹配结果 | 说明 |
贪婪型 | <h1>mytest</h1>and<h1>ok</h1> | <h1>.*</h1> | <h1>mytest</h1>and<h1>ok</h1> | .*尽可能多地匹配,因此匹配到了第二个</h1> |
懒惰型 | <h1>mytest</h1>and<h1>ok</h1> | <h1>.*?</h1> | <h1>mytest</h1>and<h1>ok</h1> | *尽可能少地匹配,因此匹配到了第一个</h1> |
基础进阶
基础进阶链接:https://blog.csdn.net/Bei_xifen/article/details/82557614