正则表达式

正则表达式(或re)是一种小型的、高度专业化的编程语言,(在python中)它内嵌在python中,并通过re模块来实现。那么在什么情况下会用到正则表达式呢,如下:
--可以为想要匹配的相应字符串集指定规则
--该字符串集可能包含英文语句、e-mail地址,命令或任何你想搞定的东西
--可以问诸如“这个字符串匹配该模式吗”,“在这个字符串中是否有部分匹配该模式呢”
--你也可以使用re以各种方式来修改或分割字符串

正则表达式模式被编译成一系列的字节码,然后由C编写的匹配引擎执行。且正则表达式语言相对小型和受限(功能有限),并非所有字符串处理都能用正则表达式完成

字符匹配
 ----普通字符
  大多数字母和字符一般都会和自身匹配
  如正则表达式test 会和字符串'test'完全匹配
 ----元字符
  .  ^  $  *  +  ?  { }  [ ]  \  |  ( )

正则表达式----元字符
[ ]
----常用来指定一个字符集:[abc];[a-z]
----元字符在字符集中不起作用:[akm$]
----补集匹配不在区间范围内的字符:[^5]

s = 'top tip tqp,twp,tep'
r = r't[oi]p' #定义一个正则表达式,匹配到tip或top
r = r't[^io]p' #定义一个正则表达式,匹配除了tip和top之外的字符
print(re.findall(r,s))

#打印结果一次为:['top', 'tip']
#              ['tqp', 'twp', 'tep']

^
----匹配行首。除非设置MULTILINE标识,它只是匹配字符串的开始。在MULTILINE模式里,它也可以直接匹配字符串中的每个换行

s= 'hello world,hello boy'
# r = r'hello' #匹配hello
r = r'^hello' #匹配到以hello开头的
print(re.findall(r,s))

#打印结果一次为:['hello', 'hello']
#              ['hello']

$
----匹配行尾,行尾被定义为要么是字符串尾,要么是一个换行字符后面的任何位置。

r= r't[abc$]' #定义一个正则,匹配以abc结尾的字符
print(re.findall(r,'ta')) #以r规则来匹配后面的字符串
print(re.findall(r,'tb'))
print(re.findall(r,'t$'))
print(re.findall(r,'at')) #以r规则来匹配后面的字符串,该字符串是以t结尾,故匹配不到

#打印结果一次为:['ta']
#             ['tb']
#             ['t$']
#             []

\
----反斜杠后面可以加不同的字符以表示不同特殊意义
----也可以用于取消所有的元字符:\[或者\^
----\d 匹配任何十进制数,它相当于类[0-9]
----\D 匹配任何非数字字符,它相当于类[^0-9]
----\s 匹配任何空白字符,它相当于类[\t\n\r\f\v]
----\S 匹配任何非空白字符,它相当于类[^\t\n\r\f\v]
----\w 匹配任何字母数字字符,它相当于类[a-zA-Z0-9_]
----\W 匹配任何非字母数字字符,它相当于类[^a-zA-Z0-9_]

{}
----可以指定正则表达式的一部分字符的重复次数

#要匹配一个座机号010-12345678这种的
r = r'^010-\d\d\d\d\d\d\d\d'
#也可以写成下面这种,\d{8}就是表示将前面的\d重复8次
r1= r'^010-\d{8}'
print(re.findall(r1,'010-834345498888'))

{m,n}
----其中m和n是十进制整数,该限定符的意思是至少重复m次,至多重复n次

r = r'a{1,3}'  #定义一个正则,表示a至少重复1次,最多重复3次
print(re.findall(r,'a'))
print(re.findall(r,'aa'))
print(re.findall(r,'aaa'))
print(re.findall(r,'aaaa'))

# 返回结果一次是:['a']
#               ['aa']
#               ['aaa']
#               ['aaa', 'a']

----忽略m会认为下边界是0,而忽略n的结果将是上边界为无穷大(实际上是20亿)
----{0}等同于*,{1,}等同于+,而{0,1}则与?相同。如果可以的话,最好使用*,+或?


*
----指定前一个字符可以被匹配零次或多次,而不是只有一次,匹配引擎会试着重复尽可能多的次数

r = r'ab*' #定义一个正则
print(re.findall(r,'a'))  #这个就是a匹配1次,b匹配0次
print(re.findall(r,'abb'))  #这个就是a匹配1次,b匹配2次

+
----表示匹配一次或更多次
----注意*和+之间的不同,*匹配0或更多次,所以可以根本就不出现;而+则要求至少出现一次

r= r'ab+' #定义一个正则
print(re.findall(r,'a'))  #以r这个正则来匹配后面的这个字符串,此时b没有,所以匹配不到
print(re.findall(r,'ab'))  #以r这个正则来匹配后面的这个字符串,此时ab各1次,就能被匹配到


----匹配一次或零次,你可以认为它用于标识某事物是可选的

r= r'^010-\d{8}$' #定义一个正则,以010开头,加一个-,以8位数字结尾
print(re.findall(r,'010-123456789')) #这里有9位数,所以匹配不到
print(re.findall(r,'010-12345678'))  #正好8位数,可以被匹配到

#座机号中间的-是可有可无的,可以不写,此时就可以用?来标识
r = r'^010-?\d{8}$'
print(re.findall(r,'01012345678'))  #此时不写-,也能被匹配到
print(re.findall(r,'010-12345678'))  #写一个-,也能被匹配到
print(re.findall(r,'010--12345678'))  #但写两个-,就匹配不到了

----?也可以用作最小匹配

r = r'ab+'
print(re.findall(r,'abbbbbbbbbbbbb')) #做最大匹配,就是最大限度匹配abbbbbbbbbbbbb
r = r'ab+?' 
print(re.findall(r,'abbbbbbbbbbbbb')) #做最小匹配,a和b只匹配一次

 

 





















上一篇:re模块


下一篇:re和正则表达式