码迷,mamicode.com
首页 > 编程语言 > 详细

python re模块学习(一)

时间:2016-06-18 06:41:07      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

正则概念

就其本质而言,正则表达式(或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(ri\b,i am handisome) # r为原始字符串使用,下面有介绍
[i]  # 这样我只会匹配到单词i 

# 不只是空格,上边定义是\w和\W的交界,也就是说我的特殊字符也属于这个交界,例如
>>> re.findall(ri\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(ri\b)  # 这是我要匹配字符串的规则,封装为compile对象
>>> print(regex.findall(text))   # 我直接使用我封装好的compile对象去字符串匹配
[i]

正则之原生字符串

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

 

python re模块学习(一)

标签:

原文地址:http://www.cnblogs.com/coolking/p/5595566.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!