python正则表达式-re
正则表达式是处理字符串的强大工具,能够实现字符串的检索、替换、匹配验证等
正则表达式常用匹配规则如下:
模式 描述
\w 匹配字符、数字以及下划线的字符
\W 匹配不是字符、数字以及下划线的字符
\s 匹配任意空白字符
\S 匹配任意非空白字符
\d 匹配任意数字
\D 匹配任意非数字的字符
\A 匹配字符串开头
\Z 匹配字符串结尾,若存在换行则只匹配到换行前的结束字符串
\z 匹配字符串结尾,若存在换行还会匹配换行符
\G 匹配最后匹配完成的位置
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配一行字符串的开头
$ 匹配一行字符串的结尾
. 匹配任意字符,除了换行符,当re.DOTALL标记指定时可以匹配包括换行符的任意字符
[...] 用来表示一组字符,,单独列出,比如[awk]匹配a、m或k
[^...] 不在[]中的字符,比如[^abc]匹配除了abc之外的字符
* 匹配零个或多个表达式
+ 匹配一个或多个表达式
? 匹配0个或1个前面的正则表达式定义的片段,非贪婪模式
{n} 精确匹配n个前面的表达式
{n,m} 匹配n到m次由前面正则表达式定义的片段,非贪婪模式
a|b 匹配a或b
() 匹配括号内的表达式,也表示一个组
匹配方法match():传入匹配的字符串以及正则表达式,从字符串起始开始匹配,一旦开头不匹配,则匹配失败,若匹配成功则返回结果,否则返回None
import re content = 'Hello 123 4567 World_This is a Regex Demo' result = re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}',content) print(result) #输出匹配到的内容 print(result.group()) #输出匹配范围 print(result.span()) 结果: <_sre.SRE_Match object; span=(0, 25), match='Hello 123 4567 World_This'> Hello 123 4567 World_This (0, 25)
匹配目标:即从字符串提取一部分内容,则可以使用()将想提取的子字符串括起来,调用group()方法传入分组索引即可
import re content = 'Hello 1234567 World_This is a Regex Demo' result = re.match('^Hello\s(\d+)\sWorld',content) print(result) print(result.group()) #提取匹配的数字 print(result.group(1)) 结果: <_sre.SRE_Match object; span=(0, 19), match='Hello 1234567 World'> Hello 1234567 World 1234567 (0, 19)
贪婪模式:.*尽可能多的匹配多的字符
import re content = 'Hello 1234567 World_This is a Regex Demo' result = re.match('^He.*(\d+).*Demo$',content) print(result) print(result.group(1)) 结果: <_sre.SRE_Match object; span=(0, 40), match='Hello 1234567 World_This is a Regex Demo'> 7
非贪婪模式:.*?尽可能匹配少的字符
import re content = 'Hello 1234567 World_This is a Regex Demo' result = re.match('^He.*?(\d+).*Demo$',content) print(result) print(result.group(1)) 结果; <_sre.SRE_Match object; span=(0, 40), match='Hello 1234567 World_This is a Regex Demo'> 1234567
修饰符 re.S: .*不能够匹配换行符,所以当遇到换行符时会导致匹配失败,而re.S就可以修正这个错误
content = '''Hello 1234567 World_This is a Regex Demo ''' result = re.match('^He.*?(\d+).*?Demo$',content,re.S) print(result) print(result.group(1)) 结果: <_sre.SRE_Match object; span=(0, 40), match='Hello 1234567 World_This\nis a Regex Demo'> 1234567
转义匹配:当遇到用于正则匹配模式的特殊字符时,则应该在其前面加\(反斜线)进行转义
import re content = '(百度)www.baidu.com' result = re.match('\(百度\)www\.baidu\.com',content) print(result) print(result.group()) 结果: <_sre.SRE_Match object; span=(0, 17), match='(百度)www.baidu.com'> (百度)www.baidu.com
seasrch()方法:在匹配时会扫描整个字符串,返回第一个匹配成功的结果,即正则表达式可以是字符串的一部分,在进行匹配的过程中search()方法会一次扫描整个字符串,直至找到第一个符合规则的字符串然后返回匹配内容(第一个内容,以后不再进行匹配),若搜索整个字符串未找到则返回None.
import re content = 'Extra stings Hello 1234567 World_This ia a Regex Demo Extra stings' result = re.search('Hello.*?(\d+).*?Demo',content) print(result) 结果: <_sre.SRE_Match object; span=(13, 54), match='Hello 1234567 World_This ia a Regex Demo'>
Findall()方法:获取匹配正则表达式的所有内容,搜索整个字符串,放回匹配正则表达式的所有内容
import re content = 'Extra stings Hello 1234567 World_This ia 456789 Regex Demo Extra stings' result = re.findall('.*?(\d+).*?',content) print(result) 结果: ['1234567', '456789']
sub()方法:进行文本的修改,例如将一段文本中的数字全部去掉
import re content = 'jfie4165efj5fkeo4fieo04fje9' result = re.sub('\d+','',content) print(result) 结果: jfieefjfkeofieofje
Compile():这个方法可以将正则字符串编译成正则表达式对象,方便在后面的匹配中再次利用
import re content = '2016-12-15 12:00' pattern = re.compile('\d{2}:\d{2}') result = re.sub(pattern,'',content) print(result) 结果: 2016-12-15