python re模块学习(一)

正则概念

就其本质而言,正则表达式(或re)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过re模块实现。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行

初入正则,re.findall()与元字符

# findall(): 去字符串中把我所有匹配到的结果,以列表形式列出

r = re.findall('alex','xxfsafasdf$alexxxxalex') 
#                     |                 |
#                 匹配规则    需要匹配结果的字符串
print(r)

==> ['alex', 'alex']  

# 以上我们使用的是普通字符做规则去匹配字符串,
# 而正则就是要更灵活的匹配字符串,所以,这里要引出一个概念:

# 原字符

# .  (小数点)
# 匹配除换行符以外的任何一个字符
>>> re.findall('al.x','xxfsafasdf$alexxxxalwx')
['alex', 'alwx']

# ^ (以什么开头)
# $ (结尾符)
>>> re.findall('^al.x','alexxxfsafasdfalexxxxalwx') 
['alex']  # 仅匹配到开头的alex

>>> re.findall('al.x$','alexxxfsafasdfalexxxxalwx')
['alwx'] # 匹配字符串到结尾

# * (0-多次重复)
>>> re.findall('alex*','alexxxfsafasdfalexxxxale')
['alexxx', 'alexxxx', 'ale']  # 匹配到0-多次重复的x

# .* (1-多个任意字符)
>>> re.findall('f.*fale','alexxxfsafasdfalexxxxalwx')
['fsafasdfale'] 

# + (1-多次重复)
>>> re.findall('alex+','alexxxfsafasdf$alexxxxale')
['alexxx', 'alexxxx']

# .+ (2-多个任意字符)
>>> re.findall('alex+','alex')
['alex']
>>> re.findall('alex.+','alex')
[]

# .? (匹配0或1此重复)
>>> re.findall('ale.?','alex')
['alex']
>>> re.findall('ale.?','ale')
['ale']

# {} (匹配范围)
>>> re.findall('ale{2}x','alexaleex') # 匹配2次重复
['aleex']
>>> re.findall('ale{2,3}x','alexaleexaleeex') # 匹配2到3次重复
['aleex', 'aleeex']
>>> re.findall('ale.{2,7}x','alexaleexaleeexalesddsx') # 同样适用.{}匹配任意字符
['alexaleex', 'aleeex', 'alesddsx']
#    [bc]     匹配b或c
>>> re.findall('a[bc]c','abcacc')
['abc', 'acc']

#    [a-z]    范围匹配,a-z任意一个字母 [1-9]  匹配1-9任意一个数字
>>> re.findall('a[a-z]c','abcacc26862')
['abc', 'acc']
>>> re.findall('[1-9]','abcacc26862') # 取到了每一个数字
['2', '6', '8', '6', '2']

#    [a*]     匹配a或*(*在中括号中无意义)
>>> re.findall('a[b*]c','abca*c')
['abc', 'a*c']

#    [^f]     取反,不包含f匹配
>>> re.findall('a[^f]c','abca*c')
['abc', 'a*c']

正则之反斜杠使用

# 反斜杠后边跟元字符去除特殊功能
# 反斜杠后边跟普通字符实现特殊功能

\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_]  注意包含下划线
\b  匹配一个单词的边界,也就是指单词和空格间的位置
     匹配单词边界(包含开始和结束),这里的“单词”,是指连续的字母、数字和下划线组成的字符串
     \b定义的是\w和\W的交界,这是个零宽界定符(zero-width assertions)只用以匹配单词的词首和词尾。单词被定义为一个字母数字序列,因此词尾就是用空白符或非字母数字符来标示的

# \b 实例
>>> re.findall('i','i am handisome')
['i', 'i']   
# 普通匹配会这样匹配每一个i,但是我现在只想匹配单词‘i’
>>> re.findall(r'i\b','i am handisome') # r为原始字符串使用,下面有介绍
['i']  # 这样我只会匹配到单词i 

# 不只是空格,上边定义是\w和\W的交界,也就是说我的特殊字符也属于这个交界,例如
>>> re.findall(r'i\b','i&am handisome') 
['i']  # &符号也会被\b所匹配到

     

re.match()

# match 匹配字符串起始位置

# 仅匹配起始位置,后边有符合匹配也不会匹配
>>> r = re.match('com', 'comwww.runcomoob')
>>> r.group()
'com'
>>> r = re.match('com', 'www.runcomoob')  # 同样包含com但是不是起始位置不匹配
>>> print(r)   # 因为不匹配,所以r就是一个None值
None

# re.match返回的是match的一个对象结果
>>> r = re.match('com', 'comwww.runcomoob')
<_sre.SRE_Match object; span=(0, 3), match='com'>

# match对象拥有以下几个方法
# group()  返回被re匹配到的字符串
>>> r.group()  # group方法拿这个对象值
'com'

# start() 返回匹配开始的位置
>>> r.start()
0

# end() 返回匹配结束的位置
>>> r.end()
3

# span() 返回一个元祖包含匹配(开始,结束)的位置
>>> r.span()
(0, 3)

re.search()

# search()找到第一个匹配的字符串
# search同样返回一个match对象


>>> r = re.search('com', 'www.rcomuncomoob') # 我有两个com
>>> r.group()
'com'
>>> r
<_sre.SRE_Match object; span=(5, 8), match='com'>
# 仅匹配到第1个com

re.sub()

# re.sub() 替换方法
# re.sub(pattern,repl,string,max)
# 将string字符串中匹配pattern的字符串替换为repl
# max为最大替换数

>>> re.sub("g.t",'have', 'i get a, i got b , i gut c')
'i have a, i have b , i have c'
>>> re.sub("g.t",'have', 'i get a, i got b , i gut c',2 ) #指定最大替换为2
'i have a, i have b , i gut c'


# re.subn() 同样为替换
>>> re.subn("g.t",'have', 'i get a, i got b , i gut c' )
('i have a, i have b , i have c', 3)
>>> re.subn("g.t",'have', 'i get a, i got b , i gut c',2 )
('i have a, i have b , i gut c', 2)

# 对比sub,它输出为元祖有两个元素,第一修改后字符串,第二是修改次数

re.split()

# split切割字符串

>>> re.split('\d+','one1two2three3four4') # \d+ 等于[1-9]+, 1个到多个数字,按数字切割此字符串
['one', 'two', 'three', 'four', '']

# 注意 , 我最后4切割完成后,还保留了一个空字符串为一个元素输出了

re.compile()

# 是将你需要匹配的规则封装为一个对象,然后直接使用这个对象调用findall、search等等匹配字符串

>>> text = "i am handsome"   # 这是我要去匹配的字符串
>>> regex = re.compile(r'i\b')  # 这是我要匹配字符串的规则,封装为compile对象
>>> print(regex.findall(text))   # 我直接使用我封装好的compile对象去字符串匹配
['i']

正则之原生字符串

>>> re.search(r'\\','www\www').group()
'\\'
# 我们拿\\去后边字符串匹配,匹配到了,但是我们后边字符串并没有\\
# 这是因为,正则本身就是一个语言,在后边字符串输入,只是提供给正则
# 正则当处理我们数据后,返回给python,因为\有特殊予以,所以返回
# python时又转译了字符串

 

posted @ 2016-06-18 02:25  Cool_King  阅读(265)  评论(0编辑  收藏  举报