正则表达式

2019-07-18

正则表达式

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

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

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

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

s = top tip tqp,twp,tep
r = rt[oi]p #定义一个正则表达式,匹配到tip或top
r = rt[^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= rt[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 = ra{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 = rab* #定义一个正则
print(re.findall(r,a))  #这个就是a匹配1次,b匹配0次
print(re.findall(r,abb))  #这个就是a匹配1次,b匹配2次

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

r= rab+ #定义一个正则
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 = rab+
print(re.findall(r,abbbbbbbbbbbbb)) #做最大匹配,就是最大限度匹配abbbbbbbbbbbbb
r = rab+? 
print(re.findall(r,abbbbbbbbbbbbb)) #做最小匹配,a和b只匹配一次

 

 





















正则表达式

正则表达式

原文地址:https://www.cnblogs.com/yttbk/p/11204045.html