- 正则表达式是一个特殊的字符序列,方便检查一个字符串是否与某种模式匹配。
re.compile |
- 根据一个模式字符串和可选的标志参数生成一个正则表达式对象,该对象拥有一系列方法用于正则表达式匹配和替换。
- compile函数用于编译正则表达式,生成一个正则表达式(Pattern)对象,供match()和search()这两个函数使用
- 语法:re.compile(pattern[, flags])
- pattern:一个字符串形式的正则表达式
- flags:可选参数,表示匹配模式,比如忽略大小写,多行模式等,例如 re.I:忽略大小写
import re
pattern = re.compile(r'\w+') # <class 're.Pattern'>正则表达式对象
ret = pattern.match('one12twothree34four',3,10)
print(ret) # <re.Match object; span=(3, 5), match='12'>
ret = pattern.search('one12twothree34four')
print(ret) # <re.Match object; span=(3, 5), match='12'>
ret为re.Match object,即匹配对象
匹配对象有以下方法:
- group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0);
- start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
- end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;
- span([group]) 方法返回 (start(group), end(group))。
pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I) # re.I 表示忽略大小写
m = pattern.match('Hello World Wide Web')
print(m) # 匹配成功,返回一个Match对象 <re.Match object; span=(0, 11), match='Hello World'>
print(m.group(0)) # Hello World 返回匹配成功的整个子串
print(m.group(1)) # Hello 返回第一个分组匹配成功的子串
print(m.group(2)) # World 返回第二个分组匹配成功的子串
print(m.groups(0)) # ('Hello', 'World')
print(m.span(0)) # (0, 11) 返回匹配成功的整个子串的索引
print(m.span(1)) # (0, 5) 返回第一个分组匹配成功的子串的索引
print(m.span(2)) # (6, 11) 返回第二个分组匹配成功的子串的索引
re.match |
- 从字符串的起始位置对模式进行匹配,如果匹配成功,则返回一个匹配对象;如果匹配失败,返回None。匹配对象的group()方法能显示成功匹配的对象。
- 语法:re.match(pattern, string, flags=0)
- pattern 匹配的正则表达式,直接传入一个字符串,python会将该字符串作为正则表达式来对待
- string 要匹配的字符串
- flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
import re
ret = re.match("hello","hello word")
或ret = pattern.match('hello word')
print(ret) #<re.Match object; span=(0, 5), match='hello'> 匹配对象
print(ret.group()) # hello 使用group()方式返回对应的分组
print(ret.start()) # 0
print(ret.end()) # 5
print(ret.span()) # (0, 5)
re.search |
- 扫描整个字符串并返回第一个成功的匹配
- 语法:re.match(pattern, string, flags=0)
import re
ret = re.search("com","www.baidu.com")
或 pattern = re.compile('com') ret = pattern.search('www.baidu.com')
print(ret) # <re.Match object; span=(10, 13), match='com'> 匹配对象
print(ret.group()) # com 使用group()方式返回对应的分组
print(ret.start()) # 0
print(ret.end()) # 5
print(ret.span()) # (0, 5)
match和search区别 |
- re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,函数返回None
- re.search匹配整个字符串,直到找到一个匹配
re.findall |
- 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
- match和search是匹配一次,findall是匹配所有
- 语法:findall(pattern, string, flags=0)
import re
ret = re.findall(r'\d+','run88oob123google456')
或 pattern = re.compile(r'\d+') ret = pattern.findall('run88oob123google456')
print(ret) # ['88', '123', '456'] <class 'list'> 列表
re.finditer |
- 和findall类似,在字符串中找到正则表达式所匹配的所有字串,并把它们作为迭代器返回。
- 语法:re.finditer(pattern, string, flags=0)
import re
it = re.finditer(r"\d+","12a32bc43jf3") # it为 <callable_iterator object at 0x0000029C1CCE7910>
for match in it:
print (match.group() )
re.sub |
- re.sub用于替换字符串中的匹配项
- 语法:re.sub(pattern, repl, string, count=0, flags=0)
- pattern:正则中的模式字符串
- repl:(replace)替换的字符串,也可以为一个函数
- string:要被查找替换的原始字符串
- count:模式匹配后替换的最大次数,默认0表示替换所有的匹配
import re
phone = "2004-959-559 # 这是一个国外电话号码"
num = re.sub(r'#.*$', "", phone)
print(num) # 2004-959-559
num = re.sub(r'\D', "", phone)
print(num) # 2004959559
re.split |
- split 方法按照能够匹配的子串将字符串分割后返回列表
- 语法:re.split(pattern, string[, maxsplit=0, flags=0])
- pattern:匹配的正则表达式
- string:要匹配的字符串
- maxsplit:分隔次数,默认为0,不限制次数;maxsplit=1,分隔一次
- flags:可选参数
(根据'\W+'匹配出来的子串,,.作为分割符,进行原字符串的分隔)
re.split('\W+', 'runoob, runoob, runoob.')
# ['runoob', 'runoob', 'runoob', '']
re.split('\W+', 'runoob, runoob, runoob.', 1)
# ['runoob', 'runoob, runoob.']
正则表达式对象 |
- re.RegexObject
- re.compile()返回RegexObject(正则表达式)对象
- re.MatchObject
- group()返回被re匹配的字符串;re.match,re.search返回的都是匹配对象
- start()返回匹配开始的位置
- end()返回匹配结束的位置
- span()返回一个元组,包含匹配(开始,结束)的位置
正则表达式语法 |
- 字符组:
符号 | 描述 |
[0-9] | 匹配数字 |
[a-z] | 匹配小写字母 |
[A-Z] | 匹配大写字母 |
[^0-9] | 匹配除了数字外的字符 |
- 元字符:
符号 | 描述 |
\d | 匹配数字 |
\w | 匹配数字字母下划线 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等 |
. | 匹配除换行符外任意一个字符 |
^ | 匹配以某字符开头 |
$ | 匹配以某字符结尾 |
[] | 字符组(只要在[]里面的都匹配) |
[^] | 非字符组(只要在[]里面的都不匹配) |
() | 分组 |
- 量词:
符号 | 描述 |
{n} | 重复n次 |
{n,} | 重复至少n次,n次以上 |
{n,m} | 重复n-m次 |
? | 0或1次 |
+ | 1到不限 |
* | 0到不限 |
- 贪婪和惰性:
表达式 | 描述 |
a.*b | 贪婪 |
a.*?b, a.+?b | 惰性 |
- 贪婪匹配模式:
- 用到量词的匹配时,默认为贪婪模式
- 贪婪模式的意思就是匹配的时候,尽量多匹配,不行再慢慢的减少匹配
import re
lst = "\d{2,4}"
ret = re.search(lst,"12345abcd")
print(ret.group())
结果:
>>>1234
- 惰性匹配模式:
- 惰性匹配模式正好和贪婪模式相对
- 惰性匹配是尽量少的匹配,不行再慢慢去增加匹配的个数
- 惰性匹配只需要在量词后面添加?即可
import re
lst = "\d{2,4}?"
ret = re.search(lst,"12345abcd")
print(ret.group())
结果:
>>>12