Python正则表达式(二)
上节我们说到 Python 正则表达式的基本字符,以及这些字符的用法
今天,我们继续讲讲 Python 中一些扩展标记法,以及一些特殊序列
(?...) : 这种扩展标记法以括号内 ? 开头,其后第一个字符决定了采用什么样的语法。
在 ? 后面添加( 'a', 'i', 'L', 'm', 's', 'u', 'x' 中的一个或多个),然后加上匹配规则。
这些字符对正则表达式设置以下标记,免去设置 flag 参数
注意 : 'a', 'L', 'u' 作为内联标记是相互排斥的,它们不能结合在一起
括号分组的非捕获版本,该分组所匹配的子字符串 不能 在执行匹配后被获取或是在之后的模式中被引用
可以配合 | 和 {m} 使用
为分组再指定一个组合名
每个组合名只能用一个正则表达式定义,只能定义一次
反向引用一个命名组合
匹配前面那个名字叫 name 的命名组中匹配到的字符串
注释信息,里面的内容会被忽略。
哈哈,是不是没看懂,没事,举个栗子
看看,是不是一下子就明了了。
哈哈,这个又看不懂?
思考一下,既然有根据后面字符断言的,那么根据前面字符来断言,也是很合理的,
如果给定的 id 或 name 存在,将会尝试匹配 yes-pattern ,否则就尝试匹配 no-pattern , no-pattern 可选,也可以被忽略。
是不是有点像 if else 三目运算,其中 id 和 name 是分组 id 、和指定的分组名 name
照旧,举个栗子吧
看了栗子是不是有点糊涂呢,我们来解析一下这个正则表达式
其结果匹配的就是 <username@host.com> 和 username@host.com 。
而不会匹配 <user@host.com ' 和 <user@host.com
但是上面的第三个结果为啥不一样呢?
因为 findall 允许返回空匹配的,在有 ? 的情况下,所以它会分两种情况去匹配
今天讲了一些扩展标记法,其实没那么难,多看看例子,多练习练习。
下节将介绍 re 模块各函数的用法,敬请期待......