正则表达式

正则表达式

一.替换

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'