正则表达式

一.替换

1.替换-部分替换

re.sub用()()()和\1\2\3等,\1代表第一个()匹配到的内容,\2代表第二个()匹配到的内容,\3代表第三个()匹配到的内容。以此类推。参考如下:

二.查找并获取
1.查找-不包含指定单词的字符串
	如果要查找不包含某些特定字符或者单词的字符串,比如:找出中间不包含AAA字段的hello…world字符串,替换成HELLO,应该写成:re.sub(r'hello((?!AA).)*?world',r'HELLO','hellobAAsaworld--hellosaworld')
记住是((?!AA).)*而不是(?!AA).*  另外,有时候需要写成(?:(?!AA).)*
	具体参考博客“正则表达式不包含指定字符串http://blog.csdn.net/maqingli20/article/details/7317925

2.查找-或

re.findall(r'gr(?:a|e)y','graygrey')输出结果是 ['gray', 'grey']

3.“|”左右位置的影响

参见xuetang爬虫程序里的正则表达式,|左右的分句摆放位置有时对结果影响特别大:comments=re.findall(r'{"body":(?:(?!children).)*?AAAAAA}|{"body":.*?"children":\[.*?\]}',comment)

4.查找-部分查找

re.findall(r'hello(.*?)world','hello2world')

三.查找匹配

1.判断是否存在某个词,用search而不用match

    if(re.search(r'Video.*?(MP4)',one_a)):

       results=re.findall(r'href="(.*?)".*',one_a);

        for result in results:

            print >>f,result

四.其他注意

1.匹配的时候,注意贪婪 .*和非贪婪 .*? 的区别

2.注意使用 .decode(‘unicode-escape’)之后,原先的字符串“假换行”会被当成“真换行”,造成正则表达式的匹配失误,所以 .decode(‘unicode-escape’)最好在最后输出的时候再使用,不要在匹配过程中使用,以防万一。

3.换行问题

要匹配包括换行在内的文本,不应该用“.*”因为这样在换行处就停止了,应该用“[\s\S]*”,也就是用“[\s\S] ”代替.但是后面测试好像也不太好,另一个想到的方法是:content=re.sub(r'\n',r'BBBBBB',content);#处理换行符,保证正则可以全文匹配

content=re.sub(r'BBBBBB',r'\n',content);#然后再替换回来。

4.一个类型的问题:

如果文本含有嵌套的结果比如{sasa{zzx}aazzxccsas{der{cxcxv}rw}sasa},并且嵌套了几层没法事先确定,那么为了去除所有这些{XX},可以采用下面的方法:

tem_len=1;

whiletem_len!=0:

   content=re.sub(r'{{(?:(?!({{|}})).)*?}}',r'',content);#将所有{{XXX}}替换成空,其中r'{{(?:(?!{{}}).)*}}'表示以{{开始,以}}结尾,且不包含{{}}的字段

    tem=re.findall(r'{{(?:(?!({{|}})).)*?}}',content);#判断是否处理完所有{{XX}}了

    tem_len=len(tem);

如果是不是去除,而是查找,可以参考我的xuetang爬虫里面的写法。

5.“\s”匹配任意空白,但是有时测试好像不太灵。用之前测试下吧。

6.给一个例子:删除文本中所有的{{}}部分,注意文本中的{{}}可能有嵌套。

import re
content=open('1.txt','rb').read();
f=open('result','wb');

content=re.sub(r'\n',r'BBBBBB',content);#处理换行符,保证正则可以全文匹配
tem_len=1;
while tem_len!=0:
    content=re.sub(r'{{(?:(?!({{|}})).)*?}}',r'',content);#将所有{{XXX}}替换成空,其中r'{{(?:(?!{{}}).)*}}'表示以{{开始,以}}结尾,且不包含{{}}的字段
    tem=re.findall(r'{{(?:(?!({{|}})).)*?}}',content);#判断是否处理完所有{{XX}}了
    tem_len=len(tem);
    
content=re.sub(r'BBBBBB',r'\n',content);
print >>f,content

f.close();
print 'OK'

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值