您的位置:首页 > 其它

正则表达式

2015-05-31 23:05 225 查看
一.替换

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'
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: