今天学习测试了一下Python中的正则表达式的模块用法。初学 Python ,对 Python 的文字处理能力有很深的印象,除了 str 对象自带的一些方法外,就是正则表达式这个强大的模块了。但是对于初学者来说,要用好这个功能还是有点难度,由于我记性不好,很容易就忘事,所以还是写下来比较好一些,同时也可以加深印象,整理思路。
由于我是初学,所以肯定会有些错误,还望高手不吝赐教,指出我的错误。

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.    匹配除换行符以外的任意字符
^    匹配字符串的开始
$    匹配字符串的结束
[]   用来匹配一个指定的字符类别
?   对于前一个字符字符重复 0 次到 1
*     对于前一个字符重复 0 次到无穷次
{}   对于前一个字符重复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、导入正则表达式模块

1
>>>  import   re

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

1
2
3
>>>  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

1
2
>>>  help (re.search)
search(pattern, string, flags = 0 )

    第一个参数:规则
    第二个参数:表示要匹配的字符串
    第三个参数:标致位,用于控制正则表达式的匹配方式
    实例:下面的例子kuangl 

1
2
3
4
5
6
7
8
>>> 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 尝试从字符串的开始匹配一个模式,也等于说是匹配第一个单词

1
2
>>>  help (re.match)
match(pattern, string, flags = 0 )

    第一个参数:规则
    第二个参数:表示要匹配的字符串
    第三个参数:标致位,用于控制正则表达式的匹配方式
    实例:下面的例子匹配Hello单词

1
2
3
4
5
6
7
8
9
10
>>> 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 在目标字符串查找符合规则的字符串

1
2
>>>  help (re.findall)
findall(pattern, string, flags = 0 )

   第一个参数:规则
   第二个参数:目标字符串
   但三个参数:后面还可以跟一个规则选择项
   返回的结果是一个列表,建中存放的是符合规则的字符串,如果没有符合规则的字符串呗找到,就会返回一个空值。
   实例:查找邮件账号

1
2
3
>>> 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 用于替换字符串的匹配项

1
2
>>>  help (re.sub)
sub(pattern, repl, string, count = 0 )

   第一个参数:规则
   第二个参数:替换后的字符串
   第三个参数:字符串
   第四个参数:替换个数。默认为0,表示每个匹配项都替换
   实例:将空白处替换成-

1
2
3
4
5
6
>>> 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 用于来分割字符串

1
2
>>>  help (re.split)
split(pattern, string, maxsplit = 0 )

   第一个参数:规则
   第二个参数:字符串
   第三个参数:最大分割字符串,默认为0,表示每个匹配项都分割
   实例:分割所有的字符串

1
2
3
4
5
6
>>> 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 可以把正则表达式编译成一个正则对象

1
2
>>> help(re.compile)
compile(pattern, flags= 0 )

   第一个参数:规则
   第二个参数:标志位 
   实例:

1
2
3
4
5
6
7
8
9
>>> 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 模块下载文件的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/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  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"