正则表达式
正则表达用来匹配字符串
正则表达式匹配过程
- 依次拿出表达式和文本中的字符串进行比价
- 如果每个字符都能匹配,则匹配成功;一旦有匹配不成功的字符,则匹配失败
- 如果有量词和边界,则匹配过程稍微有些不同
正则表达式语法规则
语法 |
说明 |
原字符串 |
正则表达式实例 |
匹配到的字符串 |
字符 |
||||
. | 匹配除换行" "外的任意字符串 | abcde | a.c | abc |
转义字符,将下一个字符标记为特殊字符,比如" "匹配换符,"\"匹配"" | abcde | ab\c | abc | |
[...] | 字符集,对应的位置可以是字符集中任意字符,字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。第一个字符如果是^则表示取反,如[^abc]表示不是abc中的其他字符。所有的特殊的字符在字符集中都失去其原有的特殊含义,比如在字符集中要匹配"^"、"]"或"-",要用转义字符进行转义"^"、"]"、"-" | afeabe | a[bcd]e |
abe |
预定义字符集 |
||||
d | 数字:[0-9] | a1cabc | adc | a1c |
D | 非数字:[^0-9] | a1cabc | aDc | abc |
s | 空白字符:[<空格> fv] | abca c | asc | a c |
S | 非空白字符:[^s] | abca c | aSc | abc |
w | 单词字符:[a-zA-z0-9_] | abca@c | awc | abc |
W | 非单词字符:[^w] | abca@c | aWc | a@c |
数量词a |
||||
* | 匹配一个字符串0或无限次 | abc* |
ab abc abccc |
|
+ | 匹配一个字符串1次或无限次 | abc+ |
abc abccc |
|
? | 匹配一个字符串0次或1次 |
abc? |
ab abc |
|
{m} | 匹配一个字符串m次 | abc{2} | abcc | |
{m,n} | 匹配一个字符串m到n次 | abc{2,3} |
abcc abccc |
|
边界匹配 |
||||
^ | 匹配字符串开头 | abcabc | ^abc | abc (匹配到的是开头的) |
$ | 匹配字符串末尾 | abcabc | abc$ | abc (匹配到的是结尾的) |
A | 匹配字符串开始 | |
Aabc | abc |
匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 | abc | abc | ||
匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 | ||||
B | 匹配非单词边界。'erB' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 | |||
逻辑分组 |
||||
| | 匹配|表达式左右的任意一个 |
wwabcww wwdefww |
abc|def |
abc def |
(...) | 作为分组,每遇到一个(,分组编号加1,使用分组的好处是匹配的子串会保存到一个子组,便于以后使用 | abcabc | (abc){2} | abcabc |
(?P<name>...) | 分组除原有编号外,再加一个别名 | abcabc | (?P<id>abc){2} | abcabc |
<number> | 引用编号为number的分组匹配到的字符串 | 1ab1 | (d)ab1 |
1ab1 |
(?P=name) | 应用别名为name的分组匹配到的字符串 | abceeabc | (?P<id>abc)ee(?P=id) | abceeabc |
特殊构造(不分组) |
||||
(?:...) | (...)的不分组版本,用于|或后接数量词 | (?:abc){2} | abcabc | |
(?iLmsux) | iLmsux中的每个字符代表正则表达式的一种匹配模式,只能用在正则表达式开头,可选多个 | (?i)abc | AbC | |
(?#...) | 将#后面的字符当做注释忽略 | abchhhdef | abc(?#hhh)def | abcdef |
(?=...) | 之后的字符串表达式需要匹配才能成功,不消耗字符串内容 | a(?=d) | 后面是数字的a | |
(?!...) | 之后的字符串表达式需要不匹配才能成功,不消耗字符串内容 | a(?!d) | 后面不是数字的a | |
(?<=...) | 之前的字符串表达式需要匹配才能成功,不消耗字符串内容 | (?<=d)a |
前面是数字的a |
|
(?<!...) | 之前的字符串表达式需要不匹配才能成功,不消耗字符串内容 | (?<!d)a | 前面不是数字的a | |
(?(id/name)yes_ pattern|no_parttern) |
如果匹配到分组为id或别名为name的字符串,则需要匹配yes_pattern 若没有匹配到,则需要匹配no_pattern |
(d)abc(?(1)d|def) |
1abc3 abcdef |
贪婪模式和非贪婪模式
贪婪模式是尽可能多的匹配字符串,python默认为贪婪模式,非贪婪模式尽可能少的匹配字符串,在正则表达式后面加个?表示非贪婪模式。例如:字符串abcccb,贪婪模式正则表达式为ab.*c,非贪婪模式的正则表达式为ab.*?c,贪婪模式结果为abccc,非贪婪模式结果为abc,再比如字符串abbb,贪婪模式正则表达式为ab?,非贪婪模式正则表达为ab??,贪婪模式结果为ab,非贪婪结果为a。
用python的re模块使用正则表达式的例子
python的re模块
re模块的方法:
-
compile(pattern[,flag]):对正则表达式pattern进行编译,编译后比直接查找速度快
-
match(patter,string[,flag]):从字符串string的开始就匹配,若匹配成功,则返回匹配对象,否则返回None(None对象没有group()和groups()方法,不判断直接调用这两个方法,则会出现异常)
-
search(pattern,string[,flag]):从字符串中查找,若匹配成功,则返回匹配对象,否则返回None
-
findall(pattern,string[,flag]):在字符串 string 中查找正则表达式模式 pattern 的所有(非重复)出现;返回一个匹配对象的列表
-
finditer(pattern,string[, flags])b 和 findall()相同,但返回的不是列表而是迭代器;对于每个匹配,该迭代器返回一个匹配对象
-
split(pattern,string, max=0) 根据正则表达式 pattern 中的分隔符把字符 string 分割为一个列表,返回成功匹配的列表,最多分割 max 次(默认是分割所有匹配的地方)
-
sub(pattern, repl, string, max=0) 把字符串 string 中所有匹配正则表达式 pattern 的地方替换成字符串 repl,如果 max 的值没有给出, 则对所有匹配的地方进行替换
匹配对象的方法和属性:
-
string:匹配时所使用的文本
-
re:匹配时使用的pattern对象
-
group(num=0) 返回全部匹配对象(或指定编号是 num 的子组)
-
groups() 返回一个包含全部匹配的子组的元组(如果没有成功匹配,就返回一个空元组)
参数flag:
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 w, W, , B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
>>> import re
>>> pattern = re.compile(r'foo')
>>> res1 = re.search(pattern,'foo')
>>> res1.group() # 返回的是匹配对象,需要调用group()方法,显示所有的匹配对象
'foo'
>>> res1.groups()# 因为没有子组(即正则表达式中没有分组),返回空元组
()
>>> res2 = re.findall(pattern,'foobbfoo')
>>> res2 # 直接返回的是一个列表,包含所有匹配的字符
['foo', 'foo']
>>> pattern2 = re.compile(r'(d+)aa')
>>> res3 = re.search(pattern2,'bb32aa')
>>> res3.group() # 返回所有的匹配的对象
'32aa'
>>> res3.groups() # 对比res1的groups(),正则里有分组,返回匹配到的分组
('32',)
>>> res4 = re.findall(pattern2,'bb32aacc5aacc')
>>> res4 # 对比res2,返回一个列表,但只包含所匹配分组里面的字符,
['32', '5']