正则表达式初步
正则表达式是一个字符串,可以用来匹配给定格式的字符。
举个例子,假如我们需要爬取网页的内容,那么当获得网页的源代码之后如何在看似混乱的html代码中获取需要的信息就成了一个重要的问题。而正则表达式就提供了匹配的一个途径。
下面是一些具体的正则表达式的字符集
转义字符
对于\,*,$, .等在正则表达式中有特殊含义的字符,需要在前面添加\表示原本字符的含义。
分组()
用()括起来的部分,作为一个整体,后面可以跟数量词。关于分组的顺序,编号为i的分组是即为左数第i个左括号的分组。我们往往使用分组来提取需要的部分,比如python的group(index)就返回第index个分组匹配的对象。
贪婪模式
量词 +,*,?,{m,n} 默认匹配尽可能长的字符串
非贪婪模式可以在上述量词之后加?表示非贪婪。
字符边界
\A 与字符串开始处匹配,不消耗任何字符
\Z 与字符串结束的地方匹配,不消耗任何字符
^ 与字符串开始处匹配,不消耗任何字符。在多行模式中,匹配每一行开头
$ 与字符串结束的地方匹配,不消耗任何字符。在多行模式中,匹配每一行末尾
|的用法
表示“或”,如果没有放在"()"中,则起作用范围是直到整个正则表达式 开头或结尾或另一个 "|"
断言
分组开头为 ?=, ?!,?<=, ?<!,则分组成为断言。断言必须被满足,但不消耗字符。
- Y(?=X ) 声明目标串Y(可为空)右侧须满足模式X。X不消耗任何字符。例如, \w+(?=\d) 与后跟数字的单词匹配,但该数字未被消耗。
- Y(?!X) 声明目标串Y(可为空)右侧不允许满足模式X。X不消耗任何字符。例如,例 如,\w+(?!\d) 与后不跟数字的单词匹配,但不消耗该数字 。
- (?<=X)Y 声明目标串Y(可为空)左侧必须满足模式X。X不消耗任何字符。例如, (?<=19)89 与跟在 19 后面的 89 的实例匹配。X须定长。
- (?<!X)Y 声明目标串Y(可为空)左侧不允许满足模式X。例如,(?<!19)89 与不跟在 19 后面的 89 的实例匹配。X须定长。
举例:
1. (?=[456])(\d{4}-?){4}(?<!7)$ 可以用来表示
合法的卡号:
1.卡号以4,5或6开头
2.卡号不以7结尾
3.必须正好包含16个数字
4.卡号中的每四个数字可能以'-’分隔
5.除数字与'-'外不能包含有其它字符
2. 可以用"(aa)*((ab)(aa|bb)*(ab|ba))*b(aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*)*"
表示所有字符集为{a, b}且由偶数个a和奇数个b构成的字符串。
(本题的思考方式是因为ab个数皆为偶数可以表示为(aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*)*,那么奇数则在前面加上(aa)*((ab)(aa|bb)*(ab|ba))*b即可,也就是找到一个前面都是{ab}偶数的b,那么后面都是偶数即可。