本文的正则表达式介绍使用python的re模块。
会 源源不断 更新。
常见正则表达式符号和特殊字符
表示法 | 解释 / 说明 |
---|---|
------------------------------------------------常见字符------------------------------------------------ | |
literal | 匹配文本字符串字面值literal |
re1|re2 | 匹配正则表达re1或re2 |
. | 匹配任何 字符(除了\n之外) |
^ | 匹配字符串起始 部分 |
$ | 匹配字符串终止 部分 |
* | 匹配0次或多次 前面出现的正则表达式 |
+ | 匹配1次或多次 前面出现的正则表达式 |
? | 匹配0次或1次 前面出现的正则表达式 |
{N} | 匹配N次 前面出现的正则表达式 |
{M,N} | 匹配M~N次 前面出现的正则表达式 |
[…] | 匹配字符集的任意单个 字符 |
[…x-y…] | 匹配x-y范围中的任意单个字符 |
[^…] | 取反,不匹配字符集出现的任意一个字符 |
(*|+|?|{})? | 用于匹配上面频繁出现/重复出现符号的非贪婪版本(*、+、?、{}) |
(…) | 匹配封闭的正则表达,另存为子组 |
------------------------------------------------特殊字符------------------------------------------------ | |
\d | 匹配任意十进制数字,即[0-9] (\D与\d相反,不匹配任何数值型的数字) |
\w | 匹配任何字母数字字符,即[A-Za-z0-9_] (\W与\w相反) |
\s | 匹配任何空格字符,即[\n\r\t\v\f] (\S与\s相反) |
\b | 匹配任何单词边界 |
\N | 匹配已保存的子组 |
\c | 逐字匹配任何特殊字符c(仅按字面意义匹配) |
\A(\Z) | 匹配字符串的起始(结束) |
圆括号指定分组
- 对正则表达式进行分组
- 匹配子组
换位
f = re.sub(r'(w+)(\.)(.*)',r'\3\2\1',
'''
www.baidu.com.cn
www.youkuaiyun.com
http://google.com.cn
''')
f = re.sub(r'(?P<name1>w+)(?P<name2>\.)(?P<name3>.*)','\g<name3>aa\g<name2>\g<name3>',
'''
www.baidu.com.cn
www.youkuaiyun.com
http://google.com.cn
''')
执行结果:
baidu.com.cn.www
youkuaiyun.com.www
http://google.com.cn
子组复用
f = re.sub(r'(?P<name1>w+)(?P<name2>\.)(?P<name3>.*?)(?P=name2)','sub--',
'''
www.baidu.com.cn
www.youkuaiyun.com
http://google.com.cn
''')
执行结果:
sub--com.cn
sub--net
http://google.com.cn
扩展表示法
正则表达式的扩展表示法,以问号开始 (?...)
,通常用于在判断前提供标记,实现一个前视、后视匹配或条件检查。
在正则表达式中圆括号指定分组
,但是在扩展表示法中只有 (?P<name>)
表述一个分组匹配,其余的都没有创建分组。
正则表达式模式 | 解释 / 说明 |
---|---|
(?iLmsux) | 指定一个或多个标记,而非通过compile()或其他re模块函数。 |
(?(1)y|x) | 条件正则匹配,类似于三目运算符,如果匹配组1(\1)存在,则与y匹配,否则,与x匹配。 |
(?i) | 表示 re.I/IGNORECASE,忽略大小写; |
(?L) | LOCALE, 字符集本地化。这个功能是为了支持多语言版本的字符集使用环境的,比如在转义符\w,在英文环境下,它代表[a-zA-Z0-9_],即所以英文字符和数字。如果在一个法语环境下使用,缺省设置下,不能匹配"é" 或 “ç”。加上这L选项和就可以匹配了。不过这个对于中文环境似乎没有什么用,它仍然不能匹配中文字符 |
(?m) | 表示 re.M/MULTILINE,实现多行混合,data 数据多行; |
(?s) | 表示符号 . 可以代表任意符号(正常情况符号 . 表示除 \n 之外的任意符号); |
(?u) | UNICODE,使用 \w, \W, \b, \B 这些元字符时将按照 UNICODE 定义的属性. |
(?x) | 表示允许用户通过抑制在正则表达式中使用空白符(除了在字符类中或者反斜线转义中)来创建更易读的正则表达式,正则表达式多行; |
(?=…) | 对目标字符串实现前视匹配,且过滤掉该表达式(?=…) 匹配的值。 |
(?!..) | 对目标字符串实现负向前视匹配,与(?=…)相反。 |
(?<=…) | 对目标字符串实现后视匹配。 |
(?<!..) | 对目标字符串实现负向后视匹配。 |
前视匹配
re.findall(r'\w+(?=.com)',
'''
www.baidu.com
youkuaiyun.com
http://www.google.com
''')
执行结果
['www.baidu', 'http://www.google']
(?=.com)
字符串后跟着.com
,才做匹配,且过滤掉.com