正则表达式
一.替换
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).)* 具体参考博客“”
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'