第二篇:正则表达式
爬虫需要用到正则,python内置了正则re模块
#!/usr/bin/env python3.5 # _*_coding:utf-8 _*_ import re #要匹配对象 line = "This is a beautiful woman" #匹配模式,^表示行首, regex_str1 = "^T.*n$" regex_str2 = "^t" if re.match(regex_str1,line): print("以T开头,以n结尾") if re.match(regex_str2,line): print("以t开头")
关于贪婪匹配和懒惰匹配:正则默认匹配模式是贪婪匹配模式:
line = "AOOOOAOOOABAlfsdf" regex_str = ".*(A.*A).*" match_obj = re.match(regex_str,line) print(match_obj.group(1))
result:
ABA
上面的例子,这种属于贪婪匹配,下面引入? 符号就能看出效果了,?属于懒惰匹配:
line = "AOOOOAOOOABAlfsdf" regex_str = "A.*?A" match_obj = re.match(regex_str,line) print(match_obj.group())
result:
AOOOOA
没加?的情况:
line = "AOOOOAOOOABAlfsdf" regex_str = "A.*A" match_obj = re.match(regex_str,line) print(match_obj.group()) result: AOOOOAOOOABA
+前面的字符至少出现一次,下面的子字符串‘AA’就不符合要求了:
line = "AOOOOAOOOABAlfAAsdf" regex_str = ".*(A.+A)" match_obj = re.match(regex_str,line) print(match_obj.group(1)) result: AlfAA
大括号,限定次数:
{m}匹配前一个字符m次,{m,n}匹配前一个字符m到n次,省略n则匹配m至无限次,省略m则匹配0至n次
中括号,指定字符:
[abc] 匹配abc中的一个,[^a] 匹配除了a以外的一个字符,[0-9] 匹配0到9中的一个
\s 匹配空白字符 \S 匹配非空白字符
\w 匹配单词字符 \W 匹配非单词字符
[\u4E00-\u9FA5] 匹配汉字:
line = "abcad大家下午好" regex_str = ".*?([\u4E00-\u9FA5].*)" match_obj = re.match(regex_str,line) print(match_obj.group(1)) result: 大家下午好
\d 匹配数字