欢迎访问www.showerlee.com, 您的支持就是我前进的动力.

[Python] re(正则表达式)模块详解

showerlee 2015-04-24 15:00 LAN, PYTHON 阅读 (1,417) 抢沙发

一、Python中转义字符

  正则表达式使用反斜杠" \ "来代表特殊形式或用作转义字符,这里跟Python的语法冲突,因此,Python用" \\\\ "表示正则表达式中的" \ ",因为正则表达式中如果要匹配" \ ",需要用\来转义,变成" \\ ",而Python语法中又需要对字符串中每一个\进行转义,所以就变成了" \\\\ "。
上面的写法是不是觉得很麻烦,为了使正则表达式具有更好的可读性,Python特别设计了原始字符串(raw string),需要提醒你的是,在写文件路径的时候就不要使用raw string了,这里存在陷阱。raw string就是用'r'作为字符串的前缀,如 r"\n":表示两个字符"\"和"n",而不是换行符了。Python中写正则表达式时推荐使用这种形式。

二、正则表达式元字符说明:

.    匹配除换行符以外的任意字符

^    匹配字符串的开始

$    匹配字符串的结束

[]   用来匹配一个指定的字符类别

?   匹配前一个字符字符0次到1次

*    匹配前一个字符0次到无穷次

+    匹配前一个字符1次到无穷次

{}   对于前一个字符重复m次

{m,n} 对前一个字符重复为m到n次

\d   匹配数字,相当于[0-9]

\D   匹配任何非数字字符,相当于[^0-9]

\s   匹配任意的空白符,相当于[ fv]

\S   匹配任何非空白字符,相当于[^ fv]

\w   匹配任何字母数字字符,相当于[a-zA-Z0-9_]

\W   匹配任何非字母数字字符,相当于[^a-zA-Z0-9_]

\b   匹配单词的开始或结束

三、导入正则表达式模块

3.1、导入正则表达式模块

>>> import  re

3.2、查看正则表达式模块方法

>>> dir(re)

['DEBUG', 'DOTALL', 'I', 'IGNORECASE', 'L', 'LOCALE', 'M', 'MULTILINE', 'S', 'Scanner', 'T', 'TEMPLATE', 'U', 'UNICODE', 'VERBOSE', 'X', '_MAXCACHE', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__version__', '_alphanum', '_cache', '_cache_repl', '_compile', '_compile_repl', '_expand', '_pattern_type', '_pickle', '_subx', 'compile', 'copy_reg', 'error', 'escape', 'findall', 'finditer', 'match', 'purge', 'search', 'split', 'sre_compile', 'sre_parse', 'sub', 'subn', 'sys', 'template']
>>>

四、常用的正则表达式处理函数

4.1、re.search

     re.search 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回,如果字符串没有匹配,则返回None。

    提示:当我们不会用模块方法的时候用help

>>> help(re.search)

search(pattern, string, flags=0)

    第一个参数:规则

    第二个参数:表示要匹配的字符串

    第三个参数:标致位,用于控制正则表达式的匹配方式

    实例:下面的例子kuangl 

>>> name="Hello,My name is kuangl,nice to meet you..."

>>> k=re.search(r'k(uan)gl',name)

>>> if k:

...     print k.group(0),k.group(1)

... else:

...     print "Sorry,not search!"

...

kuangl uan

4.2、re.match

    re.match 尝试从字符串的开始匹配一个模式,也等于说是匹配第一个单词

>>> help(re.match)

match(pattern, string, flags=0)

    第一个参数:规则

    第二个参数:表示要匹配的字符串

    第三个参数:标致位,用于控制正则表达式的匹配方式

    实例:下面的例子匹配Hello单词

>>> name="Hello,My name is kuangl,nice to meet you..."

>>> k=re.match(r"(\H....)",name)

>>> if k:

...      print k.group(0),'\n',k.group(1)

... else:

...     print "Sorry,not match!"

...

Hello

Hello

>>>

     re.match与re.search的区别:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字串,直到找到一个匹配。

4.3、re.findall

    re.findall 在目标字符串查找符合规则的字符串

>>> help(re.findall)

findall(pattern, string, flags=0)

   第一个参数:规则

   第二个参数:目标字符串

   但三个参数:后面还可以跟一个规则选择项

   返回的结果是一个列表,建中存放的是符合规则的字符串,如果没有符合规则的字符串呗找到,就会返回一个空值。

   实例:查找邮件账号

>>> mail='<user01@mail.com> <user02@mail.com> user04@mail.com' #第3个故意没有尖括号

>>> re.findall(r'(\w+@m....[a-z]{3})',mail)

['user01@mail.com', 'user02@mail.com', 'user04@mail.com']

4.4、re.sub

   re.sub 用于替换字符串的匹配项

>>> help(re.sub)

sub(pattern, repl, string, count=0)

   第一个参数:规则

   第二个参数:替换后的字符串

   第三个参数:字符串

   第四个参数:替换个数。默认为0,表示每个匹配项都替换

   实例:将空白处替换成-

>>> test="Hi, nice to meet you where are you from?"

>>> re.sub(r'\s','-',test)

'Hi,-nice-to-meet-you-where-are-you-from?'

>>> re.sub(r'\s','-',test,5)                      #替换至第5个

'Hi,-nice-to-meet-you-where are you from?'

>>>

4.5、re.split

   re.split 用于来分割字符串

>>> help(re.split)

split(pattern, string, maxsplit=0)

   第一个参数:规则

   第二个参数:字符串

   第三个参数:最大分割字符串,默认为0,表示每个匹配项都分割

   实例:分割所有的字符串

>>> test="Hi, nice to meet you where are you from?"

>>> re.split(r"\s+",test)

['Hi,', 'nice', 'to', 'meet', 'you', 'where', 'are', 'you', 'from?']

>>> re.split(r"\s+",test,3)                  #分割前三个

['Hi,', 'nice', 'to', 'meet you where are you from?']

>>>

4.6、re.compile

   re.compile 可以把正则表达式编译成一个正则对象

>>> help(re.compile)

compile(pattern, flags=0)

   第一个参数:规则

   第二个参数:标志位 

   实例:

>>> test="Hi, nice to meet you where are you from?"

>>> k=re.compile(r'\w*o\w*') #匹配带o的字符串

>>> dir(k)

['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn']

>>> print k.findall(test)     #显示所有包涵o的字符串

['to', 'you', 'you', 'from']

>>> print k.sub(lambda m: '[' + m.group(0) + ']',test)  # 将字符串中含有o的单词用[]括起来

Hi, nice [to] meet [you] where are [you] [from]?

>>>

五、用urllib2、re、os 模块下载文件的脚本

#!/usr/bin/env python

import urllib2
import re
import os
URL='http://image.baidu.com/channel/wallpaper'
read=urllib2.urlopen(URL).read()
pat =  re.compile(r'src="http://.+?.js">')
urls=re.findall(pat,read)
for i in urls:
    url= i.replace('src="','').replace('">','')
try:
    iread=urllib2.urlopen(url).read()
    name=os.path.basename(url)
    with open(name,'wb') as jsname:
    jsname.write(iread)
except:
    print url,"url error"

正文部分到此结束
版权声明:除非注明,本文由(showerlee)原创,转载请保留文章出处!
本文链接:http://www.showerlee.com/archives/1441

继续浏览:PYTHON

还没有评论,快来抢沙发!

发表评论

icon_wink.gif icon_neutral.gif icon_mad.gif icon_twisted.gif icon_smile.gif icon_eek.gif icon_sad.gif icon_rolleyes.gif icon_razz.gif icon_redface.gif icon_surprised.gif icon_mrgreen.gif icon_lol.gif icon_idea.gif icon_biggrin.gif icon_evil.gif icon_cry.gif icon_cool.gif icon_arrow.gif icon_confused.gif icon_question.gif icon_exclaim.gif