python3网络爬虫实战测验3_[Python3网络爬虫开发实战] 3.3(3)

然后再调用search()方法,它会搜索整个HTML文本,找到符合正则表达式的第一个内容返回。

另外,由于代码有换行,所以这里第三个参数需要传入re.S。整个匹配代码如下:

由于需要获取的歌手和歌名都已经用小括号包围,所以可以用group()方法获取。

运行结果如下:

齐秦往事随风

可以看到,这正是class为active的li节点内部的超链接包含的歌手名和歌名。

4aa5b22454d44466196809342abaac87.png

《正则表达式替换工具》,是一个匹配正则表达式的文本替换工具,采用一个正则表达式匹配,直接替换文本中的内容。当offset=2时,正则表达式为:(^.{2}) .表示除\n之外的任意字符,后面加{2} 就是匹配以数字或字母组成的前两个连续字符,加()就会将匹配到的结果提取出来,然后通过replace将匹配到的结果替换为新的字符串,形如:结果=结果+str。使用元字符注意事项:元字符是正则表达式的一部分,当我们要匹配正则表达式本身时,必须对这些元字符转义.下面是正则表达式用到的所有元字符。

由于search()方法会返回第一个符合条件的匹配目标,这里结果就变了:

任贤齐沧海一声笑

惰性匹配:先看字符串中的第一个字母是不是一个匹配,如果单独一个字符还不够就读入下一个字符,如果还没有发现匹配,就不断地从后续字符中读取,只道发现一个合适的匹配,然后开始下一次的匹配。1). ^ 表示必须以特定的字符开头 如 ^e 则是表示待匹配字符串必须以 e 字符开头。【rewriterule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的rewritecond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的匹配,匹配的是当前请求的url,^(.*)$意思是匹配当前url任意字符,.表示任意单个字符,*表示匹配0次或n次(n>0),后面/blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中的.* ,其实这儿将会出现一个问题,后面讨论。

注意,在上面的两次匹配中,search()方法的第三个参数都加了re.S,这使得.*?可以匹配换行,所以含有换行的li节点被匹配到了。如果我们将其去掉,结果会是什么?代码如下:

result=re.search('

(.*?)',html)

运行结果如下:

可以是纯字符串、正则表达式、列表(任一匹配就满足条件,是或运算)、true(返回所有tag节点不返回字符串节点)。首先,这是一个php正则表达式,第一个参数是号的正则表达式,第二个是你的字符串,如果匹配成功将返回真,第三个参数将匹配到的身份照赋值给$arr,他是个数组格式,$arr[0]就是你完整匹配到的号。经过测试发现,安全狗这块的匹配正则应该是\s+and这类的形式,也就是空字符(包含空格)后匹配敏感字符,所以只要想办法去掉空格安全狗就无法匹配,用普通注释/**/是不行的,安全狗也防了这块,直接匹配/**/。

由于绝大部分的HTML文本都包含了换行符,所以尽量都需要加上re.S修饰符,以免出现匹配不到的问题。

正则表达式test()方法只会根据给定的源字符串是否能匹配正则表达式而返回true或false:。2)、raw字符串的使用:如果要匹配一个.,*这种元字符,就需要加'\'进行转义,即要表示一个'\',正则表达式需要多加一个转义,写成'\\',但是python字符串又需要对其转义,最终变成re.compile('\\\\'),这样就不易理解且很乱,使用raw字符串让正则表达式变得易读,即写成re.compile(r'\\'),另一个方法就是将字符放到字符集中,即[\],效果相同。当offset=2时,正则表达式为:(^.{2}) .表示除\n之外的任意字符,后面加{2} 就是匹配以数字或字母组成的前两个连续字符,加()就会将匹配到的结果提取出来,然后通过replace将匹配到的结果替换为新的字符串,形如:结果=结果+str。

还是上面的HTML文本,如果想获取所有a节点的超链接、歌手和歌名,就可以将search()方法换成findall()方法。如果有返回结果的话,就是列表类型,所以需要遍历一下来依次获取每组内容。代码如下:

运行结果如下:

可以看到,返回的列表中的每个元素都是元组类型,我们用对应的索引依次取出即可。

如果只是获取第一个内容,可以用search()方法。当需要提取多个内容时,可以用findall()方法。

除了使用正则表达式提取信息外,有时候还需要借助它来修改文本。比如,想要把一串文本中的所有数字都去掉,如果只用字符串的replace()方法,那就太烦琐了,这时可以借助sub()方法。示例如下:

content='54aK54yr5oiR54ix5L2g'

运行结果如下:

里面一共有两个参数,先看第一个:byval lpclassname as string,字符串变量,所以这里需要传入字符串,第二个byval lpwindowname as string,同样一个字符串变量,这里也需要传入字符串。12、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。13、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。

正则表达式提取器可以用于对页面任何文本的提取,提取的内容是根据正则表达式在页面内容中进行文本匹配。如果我们需要获取h1标签中的文本(包含在h1标签中的文本,不包括h1本身),这个正则表达式应该如何写。2)、raw字符串的使用:如果要匹配一个.,*这种元字符,就需要加'\'进行转义,即要表示一个'\',正则表达式需要多加一个转义,写成'\\',但是python字符串又需要对其转义,最终变成re.compile('\\\\'),这样就不易理解且很乱,使用raw字符串让正则表达式变得易读,即写成re.compile(r'\\'),另一个方法就是将字符放到字符集中,即[\],效果相同。

results=re.findall('

\s*?()?(\w+)()?\s*?',html,re.S)

运行结果如下:

一路上有你

沧海一声笑

往事随风

光辉岁月

记事本

但愿人长久

此时借助sub()方法就比较简单了。可以先用sub()方法将a节点去掉,只留下文本,然后再利用findall()提取就好了:

运行结果如下:

可以看到,a节点经过sub()方法处理后就没有了,然后再通过findall()方法直接提取即可。可以看到,在适当的时候,借助sub()方法可以起到事半功倍的效果。

前面所讲的方法都是用来处理字符串的方法,最后再介绍一下compile()方法,这个方法可以将正则字符串编译成正则表达式对象,以便在后面的匹配中复用。示例代码如下:

content1='2016-12-15 12:00'

content2='2016-12-17 12:55'

content3='2016-12-22 13:21'

正则表达式直接量和regexp()构造函数的另一个区别是,正则表达式直接量只在解析时创建一次正则表达式对象(译注:多次解析同一个正则表达式,会产生相同的实例对象)。如果在循环体内反复创建相同的正则表达式,则每个正则对象的所有属性(比如lastindex)只会设置一次(译注:由于每次创建相同的实例对象,每个循环中的实例对象都是同一个,属性也自然相同),下面这个例子展示了两次都返回了相同的正则表达式的情形(译注:这里作者的表述只是针对es3规范而言,下面这段代码在nodejs、ie6-ie9、firefox4、chrome10、safari5中运行结果和作者描述的不一致,firefox 3.6中的运行结果和作者描述是一致的,原因可以在ecmascript5规范第24页和第247页找到,也就是说在ecmascript3规范中,用正则表达式创建的regexp对象会共享同一个实例,而在ecmascript5中则是两个独立的实例。@pattern 验证 string 对象是否符合正则表达式的规则,被注释的元素符合制定的正则表达式,regexp:正则表达式 flags: 指定 pattern.flag 的数组,表示正则表达式的相关选项。

运行结果如下:

另外,compile()还可以传入修饰符,例如re.S等修饰符,这样在search()、findall()等方法中就不需要额外传了。所以,compile()方法可以说是给正则表达式做了一层封装,以便我们更好地复用。

到此为止,正则表达式的基本用法就介绍完了,后面会通过具体的实例来讲解正则表达式的用法。

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-117770-3.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值