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

八、Python正则表达式

时间:2016-07-19 19:07:41      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:python正则表达式

Python正则表达式


一、正则表达式(或RE)是一种小型的、高度专业化的编程语言

    --- 可以为想要匹配的相应字符串集指定规则

    --- 该字符串集可能包含英文语句、e-mail地址、命令或者任何你想搞定的东西

    --- 可以问诸如“这个字符串匹配该模式吗?”

    --- “在这个字符串中是否有部分匹配该模式呢?“

    --- 你也可以使用RE以各种方式来修改或分割字符


正则表达式模式被编译成一系列的字节码,然后有用C编写的匹配引擎执行

正则表达式语言相对小型和受限(功能有限)

  --并非所有字符串处理都能用正则表达式完成


二、  字符匹配

  --普通字符

        -大多数字母和字符一半都会和自身匹配

-如正则test会和字符串“test“完全匹配

  --元字符

    . ^ $ * + ? {} [] \ | ()

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

>>> import re

>>> s = r‘abc‘

>>> re.findall(s,"abcabcaaaaabc")

[‘abc‘, ‘abc‘, ‘abc‘]

>>> r = "t[abc$]"

>>> re.findall(r,‘ta‘)

[‘ta‘]

>>> re.findall(r,‘tax‘)

[‘ta‘]

>>> re.findall(r,‘t$‘)

[‘t$‘]

>>> r = "x[0-9a-zA-Z]x"

>>> re.findall(r,‘x1x x9x xzx xAx‘)

[‘x1x‘, ‘x9x‘, ‘xzx‘, ‘xAx‘]

 ^    匹配行首

 $    匹配行尾

 \    反斜杠后面可以加不同的字符以表示不同特殊意义

\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]


三、正则表达式使用:

re模块提供了一个正则表达式引擎的接口,可以让你将REstring编译成对象并用他们来进行匹配

编译正则表达式

>>> import re

>>> p = re.compile(‘ab*‘)

>>> print p

<_sre.SRE_Pattern object at 0x7fd77e27f960>

>>> import re

>>> r1 = r"\d{3,4}-?\d{8}"

>>> re.findall(r1,"010-12345678")

[‘010-12345678‘]

>>> p_tel = re.compile(r1)

>>> p_tel.findall("010-12321312")

[‘010-12321312‘]


>>> csvt_re = re.compile(r‘csvt‘,re.I)  #不区分大小写

>>> csvt_re.findall(‘csVT‘)

[‘csVT‘]



四、执行匹配

   match() 决定RE是否在字符串刚开始的位置匹配

   search() 扫描字符串,找到这个RE匹配的位置

>>> csvt_re.match(‘csvt hello‘)

<_sre.SRE_Match object at 0x7fd77e1b8920>

>>> csvt_re.match(‘hello csvt‘)

>>> csvt_re.search(‘hello csvt heelo‘)

<_sre.SRE_Match object at 0x7fd77e1b8988>

>>> csvt_re.search(‘csvt hello‘)

<_sre.SRE_Match object at 0x7fd77e1b8920>


   findall() 找到RE匹配的所有子串,并把他们作为一个列表返回

   finditer() 找到RE匹配的所有子串,并把他们作为一个迭代器返回


MatchObject实例方法

group()  返回被RE匹配的字符串

start()  返回匹配开始的位置

end()    返回匹配结束的位置

span()   返回一个元组包含匹配(开始,结束)的位置

>>> m = csvt_re.match(‘csvt hello‘)

>>> if m:

...     print ‘Match found:‘,m.group()

... else:

...     print ‘No match‘

...

Match found: csvt

五、正则表达式内置属性

S 使.匹配包含换行在内的所欧字符

>>> r1 = r"csvt.net"

>>> re.findall(r1,‘csvtonet‘)

[‘csvtonet‘]

>>> re.findall(r1,‘csvt\nnet‘,re.S)

[‘csvt\nnet‘]


I 使匹配对大小写不敏感

L 做本地化识别匹配

M 多行匹配,影响^和$

>>> s = """

... hello csvt

... csbt hello

... hello csvt hello

... """

>>> r = r"^csvt"

>>> s

‘\nhello csvt\ncsbt hello\nhello csvt hello\n‘

>>> r = r"^csbt"

>>> re.findall(r,s,re.M)

[‘csbt‘]


X 能够使用REs的verbose状态,使之被组织得更清晰易懂

>>> tel = r"""

... \d{3,4}

... -?

... \d{8}

... """

>>> tel

‘\n\\d{3,4}\n-?\n\\d{8}\n‘

>>> re.findall(tel,‘010-12345678‘,re.X)

[‘010-12345678‘]


 六、正则分组

 通过用()来获取所需值

      >>> print s

      hhsdj hello src=csvt yes jsdjsd

      sdfsdfa src=123 yes sdfa

      src=234 yes

      hello src=python yes kas

      >>> r1 = r"hello src=.+ yes"

      >>> re.findall(r1,s)

      [‘hello src=csvt yes‘, ‘hello src=python yes‘]

      >>> r1 = r"hello src=(.+) yes"

      >>> re.findall(r1,s)

      [‘csvt‘, ‘python‘]


七、练习:利用正则表达式下载网页中所有的图片(小爬虫)

#!/usr/bin/python

import re

import urllib

def getHtml(url):

    page = urllib.urlopen(url)

    html = page.read()

    return html

def getImg(html):

    reg = r‘src="(http.+?\.jpg)"‘

    imgre = re.compile(reg)

    imglist = re.findall(imgre,html)

    print imglist

    x = 0

    for imgurl in imglist:

        urllib.urlretrieve(imgurl,‘%s.jpg‘ % x)

        x = x + 1

html = getHtml("http://www.webkaka.com/tutorial/zhanzhang/2015/040210/")

getImg(html)


本文出自 “流星宇” 博客,谢绝转载!

八、Python正则表达式

标签:python正则表达式

原文地址:http://8789878.blog.51cto.com/8779878/1827792

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