day30(正则表达式)
正则表达式
正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。
Regular Expression的“Regular”一般被译为“正则”、“正规”、“常规”。此处的“Regular”即是“规则”、“规律”的意思,Regular Expression即“描述某种规则的表达式”之意。
re模块
在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块,名字为re。
re.match是用来进行正则匹配检查的方法,若字符串匹配正则表达式,则match方法返回匹配对象(Match Object),否则返回None(注意不是空字符串"")。
匹配对象Macth Object具有group方法,用来返回字符串的匹配部分。
import re
#match从开头匹配,如果没有返回None
ret = re.match('w','www.baidu.com')
print(ret)
print(ret.group())
表示字符
.点匹配任意一个字符
[]匹配[]里边任意一个字符
\d匹配一个数字
\D匹配一个非数字
\s匹配一个空白,空格 Tab键
\S匹配一个非空白
\w匹配一个单词字符,中文,A-Z,a-z,0-9,_
\W匹配一个非单词字符,中文,A-Z,a-z,0-9,_
[\u4e00-\u9fa5]中文
\表示转义
r只对\有用
例如:
import re
#.点匹配任意一个字符
ret = re.match('.','1www.baidu.com')
print(ret)
print(ret.group())
表示数量
*匹配前一个字符出现0次或者无限次
+匹配前一个字符出现1次或者无限次
?匹配前一个字符出现1次或者0次
{m}匹配前一个字符出现m次
{m,}匹配前一个字符至少出现m次
{m,n}匹配前一个字符出现m到n次
例如:
import re
ret = re.match(r'e*','ererrtrrfdgwc:\\a\\b')
print(ret)
print(ret.group())
表示边界:
^匹配字符串开头
$匹配字符串结尾
\b匹配字符串边界
\B匹配非字符串边界
例如:
import re
#^匹配字符串开头
ret = re.search(r'^err','errderrtrrfdgwc:\\a\\b')
print(ret)
print(ret.group())
匹配分组
[^a-z]表示除了a-z
|匹配左右任意一个表达式
(ab)将括号中字符作为一个分组
\num引用分组序号num匹配到的字符串
(?P)给分组起别名
(?P=name)引用别名为name的分组匹配到的字符串
例如:
import re
#(?P)给分组起别名
ret = re.match(r'<(?P\w+)>(\w+)','haha')
print(ret)
print(ret.group(1))
print(ret.group(2))
re模块的高级用法
match 方法:从起始位置开始查找,一次匹配
search 方法:从任何位置开始查找,一次匹配
findall 方法:全部匹配,返回列表
finditer 方法:全部匹配,返回迭代器
split 方法:分割字符串,返回列表
sub 方法:替换
贪婪和非贪婪
Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;
非贪婪则相反,总是尝试匹配尽可能少的字符。
在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪。
import re
#贪婪和非贪婪
pattern = re.compile(r'(.+)(\d+-\d+-\d+-\d+)')
ret = pattern.match('This is a number 234-235-22-423')
print(ret)
print(ret.group())
print(ret.group(1))
print(ret.group(2))
print('*****************************')
pattern = re.compile(r'(.+?)(\d+-\d+-\d+-\d+)')
ret = pattern.match('This is a number 234-235-22-423')
print(ret)
print(ret.group())
print(ret.group(1))
print(ret.group(2))
结果:
<_sre.SRE_Match object; span=(0, 31), match='This is a number 234-235-22-423'>
This is a number 234-235-22-423
This is a number 23
4-235-22-423
*****************************
<_sre.SRE_Match object; span=(0, 31), match='This is a number 234-235-22-423'>
This is a number 234-235-22-423
This is a number
234-235-22-423