参考资料:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832260566c26442c671fa489ebc6fe85badda25cd000
https://baike.baidu.com/item/正则表达式/1700215?fr=aladdin
https://blog.csdn.net/make164492212/article/details/51656638
1、正则表达式的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。
2、在正则表达式中,如果直接给出字符,就是精确匹配。此外,规定了若干标准匹配格式和通配符,常用的如下:
(1)\d:匹配一个数字。
(2)\w:匹配一个字母或数字。
(3).:匹配任意1个字符。
(4)\s:匹配一个空格。
(5)*:任意个数字符(包含0个)。
(6)+:至少1个字符。
(7)?:0个或1个字符。
(8){n}:n个字符,如\d{n}:表示n个数字。
(9){n,m}:n-m个字符。
(10)[]表示字符范围,如[a-z]表示字符取值范围为a-z。
(11)-、_在正则表达式中均为特殊字符,要表示这些字符的本身,需要使用'\_'和'\-'。
(12)A|B:匹配A或B。
(13)^表示行首,$表示行尾。
注:有关正则表达式的详细规则,请查看参考资料2。
3、python中内置的re模块用于实现基于正则表达式的匹配判断、分组、字符串分割等操作。
(1)匹配判断。re.match(正则表达式字符串,目标字符串),如果目标字符串与正则表达式匹配,则返回一个match对象,否则返回None。
注:由于\在python字符串表达式中属于转义字符,所以要表达正则表达式的完整转义字符,需要\\表示,如'\\d',因此,python提供的r'字符串'方式,可以不用在意特殊的转义字符,及r'\d'等同于'\\d'。
(2)分组:正则表达式中使用()表示分组,如^(\d+)(0*)$表示匹配以数字和连续0组成的两个分组。一旦通过m=re.match()匹配成功,即可通过m.groups()、m.group(index)获取全部分组及指定分组的内容。
注:正则表达式默认匹配尽可能多的字符(贪婪匹配),比如用^(\d+)(0*)$去匹配123000,分组将为('123000', '')而非('123', '000'),因为前面的d+在前,会自动匹配后面的0,等到0*去匹配时,只剩下''了。要达到预想的效果,就是将正则表达式改为^(\d+?)(0*)$,在前面的分组末端加上?将其变为非贪婪匹配。
(3)分割:通过re.split(正则表达式,字符串)可实现字符串的分割。如re.split(r's+', 'a b c')的结果为['a','b','c']。
(4)编译:为了提高匹配效率,在同一个正则表达式需要完成多次字符串匹配的情况下,可通过m=re.compile(正则表达式)将正则表达式事先编译,然后通过m.match(字符串)的方法提高匹配效率。
下面是我的学习代码:
import re
def Test():
#测试非贪婪匹配
m = r'^(\d+)(0*)$'
p = '012000'
r = re.match(m, p)
print 'Groups "%s" grouped by "%s":' % (p, m), r.groups()
m = r'^(\d+?)(0*)$'
r = re.match(m, p)
print 'Groups "%s" grouped by "%s":' % (p, m), r.groups()
#测试分割
m = r'\s+'
p = 'a b c d'
print 'Result "%s" splited by "%s":' % (p, m), re.split(m, p)
#测试分组
m = r'^(\d{3})-(\d{3,8})$'
p = '010-12345'
r = re.match(m, p)
if r != None:
print 'Groups "%s" grouped by "%s":' % (p, m), r.groups()
print 'Group0 "%s" grouped by "%s":' % (p, m), r.group(0)
print 'Group1 "%s" grouped by "%s":' % (p, m), r.group(1)
print 'Group2 "%s" grouped by "%s":' % (p, m), r.group(2)
else:
print 'No group'
#测试匹配
m = r'^\d{3}\-\d{4,7}$'
p = '010-1234'
r = re.match(m, p)
print 'Did "%s" matched with "%s" ?' % (p, m), r != None
#测试编译
mm = re.compile(m)
print 'Did "%s" matched with "%s" ?' % (p, m), mm.match(p) != None
参考资料中给出的电子邮箱匹配问题可查阅参考资料3。
今天就学习到这里,下一节从常用内建模块学起。