首页 / 操作系统 / Linux / Python中re(正则表达式)模块详解
今天学习测试了一下Python中的正则表达式的模块用法。初学 Python ,对 Python 的文字处理能力有很深的印象,除了 str 对象自带的一些方法外,就是正则表达式这个强大的模块了。但是对于初学者来说,要用好这个功能还是有点难度,由于我记性不好,很容易就忘事,所以还是写下来比较好一些,同时也可以加深印象,整理思路。由于我是初学,所以肯定会有些错误,还望高手不吝赐教,指出我的错误。一、Python中转义字符正则表达式使用反斜杠" "来代表特殊形式或用作转义字符,这里跟Python的语法冲突,因此,Python用" \\ "表示正则表达式中的" ",因为正则表达式中如果要匹配" ",需要用来转义,变成" \ ",而Python语法中又需要对字符串中每一个进行转义,所以就变成了" \\ "。上面的写法是不是觉得很麻烦,为了使正则表达式具有更好的可读性,Python特别设计了原始字符串(raw string),需要提醒你的是,在写文件路径的时候就不要使用raw string了,这里存在陷阱。raw string就是用"r"作为字符串的前缀,如 r"
":表示两个字符""和"n",而不是换行符了。Python中写正则表达式时推荐使用这种形式。二、正则表达式元字符说明:. 匹配除换行符以外的任意字符
^ 匹配字符串的开始
$ 匹配字符串的结束
[] 用来匹配一个指定的字符类别
? 对于前一个字符字符重复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_]
匹配单词的开始或结束三、导入正则表达式模块
3.1、导入正则表达式模块
>>> import re3.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 uan4.2、re.match
re.match 尝试从字符串的开始匹配一个模式,也等于说是匹配第一个单词
12 >>> 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),"
",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 在目标字符串查找符合规则的字符串
12 >>> 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 用于替换字符串的匹配项
12 >>> 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 用于来分割字符串
12 >>> 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 可以把正则表达式编译成一个正则对象
12 >>> help(re.compile)
compile(pattern, flags=0) 第一个参数:规则
第二个参数:标志位
实例:
>>> test="Hi, nice to meet you where are you from?"
>>> k=re.compile(r"w*ow*") #匹配带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"推荐阅读:Python脚本获取Linux系统信息 http://www.linuxidc.com/Linux/2013-08/88531.htmPython文件处理:读取文件 http://www.linuxidc.com/Linux/2013-08/88496.htm如何发布自定义的Python模块 http://www.linuxidc.com/Linux/2013-08/88495.htmPython爬虫多线程抓取代理服务器 http://www.linuxidc.com/Linux/2013-07/87289.htm