当先锋百科网

首页 1 2 3 4 5 6 7

1.常用匹配符号和其意义

(1) . : 匹配任意字符,换行符"\n"除外。

(2) *:匹配前一个字符0次或者无限次。

(3) ?: 匹配前一个字符0次或者无限次。

(4) +:匹配前面的子表达式一次或多次(大于等于1次)

(5)  ( ): 括号内数据作为结果返回。

  常用组合

(5) . * : 贪心算法,匹配最长符合字符,并返回。

(6) . *? : 非贪心算法,匹配最短符合字符,返回一个数组。


2.python中所用到的匹配方法。

   findall : 匹配所有符合规律的内容,返回包含结果的列表。

  search : 匹配第一个符合规律的内容并返回。

  sub : 替换符合规律的内容,返回替换后的值。

3.例子

#-*-coding:utf8-*-

#导入re库文件
import re
# from re import findall,search,S



#.的使用举例
a = 'xy123'
b = re.findall('x...',a)
print b
#输出 ['xy12']
#解析:...相当于占位符,可以替代任意字符,换行符则不可以

#*的使用举例
a = 'xyxyyy123'
b = re.findall('xy*',a)
print b
#输出 ['xy', 'xyyyy']
#解析:原先以为会输出['xy','xyyy','xyyyy'],但事实结果如上,从这里理解为:* 匹配0次,即为'xy',
#无限多次即为'xyyyy',就是一个位置只能匹配一次,而且是往最多处匹配。就像一个胖子一样,他只能在一处
#咬一口,所以他在条件允许内(规则内),咬了一口最大的,和?刚好相反。

#?的使用举例
a = 'xyxyyy123'
b = re.findall('xy?',a)
print b
#输出 ['xy', 'xy']
#解析:原先以为输出['xy','xy','xyy'],但事实结果如上,这里理解为:?匹配 0次,就有2处,所以结果是
#['xy', 'xy'],匹配1次结果是['xyy'],合并2者,由于'xy'和'xyy'都是一处选取出来的,所以选择最短的匹配。

'''上面的内容全部都是只需要了解即可,需要掌握的只有下面这一种组合方式(.*?)'''

secret_code = 'hadkfalifexxIxxfasdjifja134xxlovexx23345sdfxxyouxx8dfse'

# #.*的使用举例
b = re.findall('xx.*xx',secret_code)
print b
#输出 ['xxIxxfasdjifja134xxlovexx23345sdfxxyouxx']
#解析:这是贪心的用法,在规则内,尽可能的选取长度最大的匹配,并且返回字符串。

# # #.*?的使用举例
c = re.findall('xx.*?xx',secret_code)
print c
#输出 ['xxIxx', 'xxlovexx', 'xxyouxx']
#解析:这是非贪心算法,在在规则内,尽可能选取长度最小的匹配,返回结果的列表.
#
# #使用括号与不使用括号的差别
# 这里不举例子了,括号内的字符串就是返回的结果,否则是全部。


#对比findall与search的区别
s2 = 'asdfxxIxx123xxlovexxdfd'
f = re.search('xx(.*?)xx123xx(.*?)xx',s2).group(2)
print f
#输出 love
#解析:search是找寻第一个符合条件的字符串,S2中只有一个字符串符合,group(2)表示
#输出第二个括号的内容

f2 = re.findall('xx(.*?)xx123xx(.*?)xx',s2)
print f2[0][1]
#输出 love
#解析:findall是匹配所有符合规律的内容,返回包含结果的列表,S2中也只有一个字符串符合,所以它创建一个二维数组
#f2[0]存放['I','love'],则f2[0][1]就是'love'

#sub的使用举例
s = '123rrrrr123'
output = re.sub('123(.*?)123','123%d123'%789,s)
print output
#输出 123789123
#解析:将rrrr用789替换了,写法如上,有点像c的写法


#匹配数字,'+'的使用
a = 'asdfasf1234567fasd555fas'
b = re.findall('(\d+)',a)
print b
#输出 ['1234567', '555']
#解析:这里也是往最大长度选取,和*的不同是,它最少有一次匹配。

#最后说一下python的re.S
f3 = re.findall('xx(.*?)xx123xx(.*?)xx',s2,re.S)
#如上,re.S的作用就是'.'可以匹配换行符'\n',可以回头去看看'.'的定义。