正则表达式
正则表达式
为什么使用正则
正则表达式为高级的文本模式匹配、抽取、与/或文本形式的搜索和替换功能提供了基础。正则表达式是一些由字符和特殊符合组成的字符串,描述了模式的重复或表述多个字符。正则表达式能按照某种模式匹配一系列有相似特征的字符串。
Python通过标准库中的re模块来支持正则表达式。
元字符
元字符是一系列特殊符号和字符,正是它给予正则表达式强大的功能和灵活性。
常见正则表达式和特殊符号
| 元字符 | 描述 | 示例 |
|---|---|---|
| literal | 匹配文本字符串的字面值literal | foo |
| re1|re2 | 匹配正则表达式re1或re2 | foo|bar |
| . | 匹配除\n外的任意字符 | a.b |
| ^ | 匹配字符串起始部分 | ^ab |
| $ | 匹配字符串终止部分 | ab$ |
| * | 匹配0次或多次前面出现的正则表达式 | [A-Z]* |
| + | 匹配1次或多次前面出现的正则表达式 | [A-Z]+ |
| ? | 匹配0次或1次前面出现的正则表达式 | ab? |
| {N} | 匹配N次前面出现的正则表达式 | [0-9]{2} |
| {M,N} | 匹配M~N次前面出现的正则表达式 | [0-9]{2,3} |
| [a-z] | 匹配字符集中出现的任一字符 | [ab] |
| [a-z] | 匹配a~z范围中的任一字符 | [a-z] |
| [^ab] | 不匹配字符集中的字符,可以使用范围字符 | [^ab] |
| (*|+|?|{})? | 用于匹配上面频繁出现、重复出现符号的非贪婪版本(*、+、?、{}) | .*?[a-z] |
| (…) | 匹配封闭的正则表达式,然后另存为子组 | ([0-9]{3})?,f(oo |
| \d | 匹配十进制数字,相当于[0-9],与\D相反 | ab\d |
| \w | 匹配任意字母数字,相当于[A-Za-Z0-9],与、\W相反 | [A-Za-z_]\w |
| \s | 匹配任意空格字符,相当于[\n\t\r\v\f],与\S相反 | of\sthe |
| \b | 匹配单词边界,与\B相反 | \bThe\b |
| \N | 匹配以保存的子组N,参见(…) | ab:\2 |
| \c | 逐字匹配任何特殊字符c,斜线是转义 | , |
| \A(\Z) | 匹配字符串的起始(结束) | \Acd |
| (?iLmsux) | 在正则表达式中嵌入一个或多个特殊“标记”参数 | (?x),(? im) |
| (?:…) | 表示一个匹配不用保存的分组 | (?:\w+\.)* |
| (?P |
像一个仅由name标识而不是数字ID标识的正则分组匹配 | (?P) |
| (?P=name) | 在同一字符串中匹配由(?P<\name)分组的之前文本 | (?P=data) |
| (?#…) | 表示注释,所有内容都被忽略 | (?#comment) |
| (?=…) | 匹配条件是如果…出现在之后的位置,而不使用输入字符串;称作正向前视断言 | (?=.com) |
| (?!…) | 匹配条件是如果…不出现在之后的位置,而不使用输入字符串;称作负向前视断言 | (?!.net) |
| (?<=…) | 匹配条件是如果…出现在之前的位置,而不使用输入字符串;称作正向后视断言 | (?<=800-) |
| (?<!…) | 匹配条件是如果…不出现在之前的位置,而不使用输入字符串;称作负向后视断言 | (?<!192\.168\.) |
| (?(id/name)Y|N) | 如果分组所提供的id或者name(名称)存在,就返回正则表达式的条件匹配Y,如果不存在,就返回N; | N是可选项 |
使用择一符号匹配多个正则表达式模式
表示择一匹配的是管道符(|),用于分割不同的正则表达式。也称作并(union)、逻辑或(OR)
使用闭包操作符是想存在性和频数匹配
星号将匹配其左边的正则表达式出现零次或多次的情况,该操作成为Kleene闭包;加号将匹配一次货多次出现的正则表达式,称为正闭包操作符。其他如问号匹配零次或一次,大括号匹配N次或一个范围。
如果问号紧跟在任何使用闭合操作符的匹配后面,将匹配尽可能少的次数,非贪婪匹配。
当模式匹配使用分组操作符时,正则表达式引擎将试图“吸收”匹配该模式的尽可能多的字符。这通常被叫做贪婪匹配。
| 正则表达式 | 匹配字符串 |
|---|---|
| [dn]ot? | 字母“d”或者“n”,后面跟着一个“o”,然后是最多一个“t”,例如,do、no、dot、not |
| 0?[1-9] | 任何数值数字,它可能前置一个“0”,例如,匹配一系列数(表示从1~9月的数值),不管是一个还是两个数字 |
| [0-9]{15,16} | 匹配15或者16个数字(例如信用卡号码) |
| </?[^>]+> | 匹配全部有效的(和无效的)HTML标签 |
| [KQRBNP][a-h][1-8]-[a-h][1-8] | 在“长代数”标记法中,表示国际象棋合法的棋盘移动(仅移动,不包括吃子和将军)。即“K”、“Q”、“R”、“B”、“N”或“P”等字母后面加上“a1”~“h8”之间的棋盘坐标。前面的坐标表示从哪里开始走棋,后面的坐标代表走到哪个位置(棋格)上 |
使用圆括号指定分组
圆括号功能
- 对正则表达式进行分组
- 匹配子组
| 正则表达式 | 匹配字符串 |
|---|---|
| \d+(.\d*)? | 表示简单浮点数的字符串;也就是说,任何十进制数字,后面可以接一个小数点和零个或者多个十进制数字,例如“0.004”、“2”、“75.”等 |
| (Mr?s?.)?[A-Z][a-z]*[A-Za-z-]+ | 名字和姓氏,以及对名字的限制(如果有,首字母必须大写,后续字母小写),全名前可以有可选的“Mr.”、“Mrs.”、“Ms.”或者“M.”作为称谓,以及灵活可选的姓氏,可以有多个单词、横线以及大写字母 |
扩展
| 正则表达式 | 匹配字符串 |
|---|---|
| (?:\w+.)* | 以句点作为结尾的字符串,例如“google.”、“twitter.”、“facebook.”,但是这些匹配不会保存下来供后续的使用和数据检索 |
| (?#comment) | 此处并不做匹配,只是作为注释 |
| (?=.com) | 如果一个字符串后面跟着“.com”才做匹配操作,并不使用任何目标字符串 |
| (?!.net) | 如果一个字符串后面不是跟着“.net”才做匹配操作 |
| (?<=800-) | 如果字符串之前为“800-”才做匹配,假定为电话号码,同样,并不使用任何输入字符串 |
| (?<!192.168.) | 如果一个字符串之前不是“192.168.”才做匹配操作,假定用于过滤掉一组C类IP地址 |
| (?(1)y|x) | 如果一个匹配组1(\1)存在,就与y匹配;否则,就与x匹配 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 emplay!
