正则表达式

来源:互联网 发布:跳舞毯软件 编辑:程序博客网 时间:2024/05/17 03:20

正则表达式在线测试;

                                http://tool.oschina.net/regex

网页源码:

<div class="bd"> <p class=""> 导演: 弗兰克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·罗宾斯 Tim Robbins /...<br> 1994&nbsp;/&nbsp;美国&nbsp;/&nbsp;犯罪 剧情 </p>正则表达式:

for sel in response.xpath('//div[@id="info"]'):

item['director']=re.findall("(?<=导演\:).+?(?=主演)",str(a))


1)数量词的贪婪模式与非贪婪模式

正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式”ab*”如果用于查找”abbbc”,将找到”abbb”。而如果使用非贪婪的数量词”ab*?”,将找到”a”。

注:我们一般使用非贪婪模式来提取。

(2)反斜杠问题

与大多数编程语言相同,正则表达式里使用”\”作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符”\”,那么使用编程语言表示的正则表达式里将需要4个反斜杠”\\\\”:前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。

Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r”\\”表示。同样,匹配一个数字的”\\d”可以写成r”\d”。有了原生字符串,妈妈也不用担心是不是漏写了反斜杠,写出来的表达式也更直观勒

1、re.match    从第一个字符匹配,第一个字符不对,就错误

result=re.match(pattern,content),pattern为正则表达式,content为匹配的文本,非贪婪匹配加?例如(.*?),当匹配有换行符时,在match中加re.S

总结:尽量使用泛匹配,使用括号得到匹配目标,尽量使用非贪婪模式,有换行符就用re.S

2、re.search    扫描整个字符串并返回第一个成功的匹配

总结:为了匹配方便,能用search不要match


3、re.findall    搜索字符串,以列表形式返回全部能匹配的子串(想收集什么就用()标记组)

(1)匹配所有带有超链接的歌信息


results搜索结果以列表形式显示,通过遍历,输出每个列表的内容

(2)匹配所有歌的信息,包括没有超链接


\s空白符,因为有的有换行符有的没有,所以加*?判断。同理,有的有<a>有的没有,然后匹配歌名,通过(\w+)匹配字符串

4、re.sub   替换字符串中每一个匹配的子串后返回替换后的字符串  re.sub(pattern表达式,repl替换成的文字,string原内容)

把符合所写正则表达式的字符串替换成所要替换的字符串,通常跟re.findall一块使用


先把a的开始<a>和结束</a>去掉,然后匹配歌名

5、re.compile

将正则字符串编译成正则表达式对象

实例:爬取豆瓣读书

import requestsimport re#打印网页源码content=requests.get('https://book.douban.com/').text#正则匹配pattern=re.compile('<li.*?cover.*?href="(.*?)".*?title="(.*?)".*?more-meta.*?author">(.*?)</span>.*?year">(.*?)</span>.*?</li>',re.S)#搜索results=re.findall(pattern,content)#遍历结果for result in results:    #默认按照顺序赋值    url,title,author,date=result    #去除换行符\n,效果类似restrip()    author=re.sub('\s','',author)    date=re.sub('\s','',date)    print(url,title,author,date)
效果:


原创粉丝点击