遇到了一个小虫,特记录之。
1.正则表达式及英文的处理如下:
>>> import re>>> b='adfasdfasf<1safadsaf>23wfsa<13131>'>>> pat = re.compile('<.*?>')>>> pat.findall(b)['<1safadsaf>', '<13131>']
2. 换成中文貌似就没反应了
>>> msg="">>> pat.findall(msg)[]
仔细分析了下貌似因为其中的\n字符!
甚为不解,又try了一把:
>>> msg ='<\r>asdasf'>>> pat.findall(msg)['<\r>', ' ']>>> msg='<\n>adf '>>> pat.findall(msg)[' ']>>> msg='<\s>adaf '>>> pat.findall(msg)['<\\s>', ' ']>>> msg='<\n>asdfasf '>>> pat.findall(msg)[' ']
确实点号无法匹配特殊字符'\n'!
在找到了说明。
. | 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。 |
3.[.\n]的尴尬情况
>>> pat= re.compile('<[.\n]*?>')>>> pat.findall(msg)['<\n>']
>>> msg'<\n>asdfasf'
>>> msg='<\nasdfs>adaf'>>> pat.findall(msg)[]
谷歌了一番,找到了答案,在。即加入DOTALL选项。如下:
>>> pat = re.compile('<.*?>',re.DOTALL)>>> pat.findall(msg)['<\nasdfs>', '']