正则表达式
2015-05-31 23:05
225 查看
一.替换
1.替换-部分替换
re.sub用()()()和\1\2\3等,\1代表第一个()匹配到的内容,\2代表第二个()匹配到的内容,\3代表第三个()匹配到的内容。以此类推。参考如下:
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'
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'
相关文章推荐
- Chernoff-Hoeffding Bound
- laravel 学习笔记——路由(路由与控制器)
- Android Studio中快捷键的设置
- 测试计划
- SQL Server 开发指南---基础编程
- 【百度之星初赛2】魔法因子|乘某个数首末位互换(数学,灵活题)
- HOG特征理解
- MFC UI按钮多线程
- js对象私有变量公有变量问题
- Android布局之线性布局
- Java
- 烂泥:学习ubuntu远程桌面(一):配置远程桌面
- HDU 2046
- 一念放下
- 【数据结构】用栈检测括号是否匹配
- Java-LockSupport的小例子
- SRS文档
- hdu 5256(最长上升子序列)
- 快速排序
- kb-09-线段树--区间合并比较繁