正则表达式符号(元字符)
'.':通配符。默认匹配除了'\n'以外的任意一个字符(包括字母、符号与数字)。若指定flag DOTALL,则匹配任意字符包括换行。
'^':匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$':匹配字符结尾。
'[]':匹配中括号中的一个字符
'?':匹配前一个字符0或1次
'*':匹配*号前的字符0次或多次
'+':匹配+号前一个字符1次或多次
'{m}':匹配前一个字符m次
'{m,n}':匹配前一个字符m到n次
'|':匹配|左或|右的字符
'(exp)':分组匹配, 括号内就是一个分组,组号从1开始。\1
'(?:exp)':取消括号内分组,没有分组号。
'\A':只从字符开头匹配
'\Z':匹配字符结尾。
'\d':匹配数字0-9
'\D':匹配非数字
'\w':只匹配[A-Za-z0-9]
'\W':只匹配非[A-Za-z0-9]
'\s':匹配空白字符、\t、\n、\r
'\b':捕捉与特殊字符之间的边界,如re.findall(r'a\b', 'a$')
'*?,+?,??':则是取消贪婪模式,尽量匹配最少的。例如re.findall('<.*?>', 'sdfs')
'(?P
'(?=exp)':正预测先行断言:表示匹配项后必须是满足exp条件。注意:断言不是分组,所以没有分组号。例:d = "wood boost foo "; re.findall("f(?=ood)", d)
'(?<=exp)':正回顾后发断言:表示匹配项前需要满足exp条件。例:d = "wood boost foo "; re.findall("(?<=w)ood", d)
'(?!exp)':负预测先行断言。表示匹配项后必须不是exp条件。例:d = "123456 "; re.findall("\d{3}(?!\d)", d)
匹配字符串的常用方法
match方法
从头至尾匹配字符,匹配严格
re.match(a,b)
a参数为匹配条件(正则表达式符号);b参数为要匹配字符串
re.match('dsf\d+','dsf1221sdf')
search方法
从头到尾匹配一次,只要匹配到就返回。
re.search(a,b)
a参数为匹配条件(正则表达式符号);b参数为要匹配字符串
例:
a = re.search('\d','sdf123dser')
print(a.group())
findall方法
匹配多次,直到找到所有匹配。并以列表输出。
urls2 = '''https://www.jianshu.com
https://www.baidu.com'''
data3 = re.findall("^(?:http|https).*", urls2, flags=re.M)
print("3: \033[31;1m{}\033[0m\n".format(data3))
finditer方法
返回迭代器,且里面的元素为match对象。使用循环遍历或next取出元素(惰性求值),然后对元素用groups,取分组。
compile方法
words = "Hello world "
cp = re.compile("[a-z]+")
cp.search(words, 2,10) # 限定匹配区间
split方法
匹配并分割
re.split('分隔字符/规则','分割对象')
例re.split('e','sdfesdfe223')
sub方法
匹配并替换
re.sub("匹配内容","替换内容","匹配对象",count=N)
N为从开头到结尾匹配次数
re.sub('[0-9]+',' ','sdf234dsf34csdfs234sdf',count=1)
subn方法
匹配并替换,最后返回结果与替换次数
re.subn("匹配内容","替换内容","匹配对象",count=N)
flags参数(模式修正符)
re.I:忽略大小写
例:re.search('[a-z]+','sdfASDSAfgds',flags=re.I)
re.M:多行匹配。如果有托字符^或$,则影响每行(行首、行尾)。
re.L:本地化识别匹配。
re.U:根据unicode字符来解析。
re.S:单行匹配:使'.'可以匹配换行符:
贪婪模式与懒惰模式
常规贪婪模式
匹配任意多个字符:.*
懒惰模式
最少匹配任意字符:.*?
例:
a = 'a.*b'
b = 'a.*?b'
c = 'asdf12321bc*^%$b'
re.search(a, c)
re.search(b, c)