设为首页 收藏本站
查看: 1185|回复: 0

[经验分享] 【Python爬虫学习笔记(2)】正则表达式(re模块)相关知识点总结

[复制链接]

尚未签到

发表于 2015-11-30 11:25:59 | 显示全部楼层 |阅读模式
  1. 正则表达式
  正则表达式是可以匹配文本片段的模式。
  1.1 通配符
  正则表达式能够匹配对于一个的字符串,可以使用特殊字符创建这类模式。(图片来自cnblogs)
DSC0000.png
  1.2 特殊字符的转义
  由于在正则表达式中,有时需要将特殊字符作为普通字符处理,就需要用‘\’进行转义,例如‘python\\.org’就会匹配‘python.org’,那么为什么要用两个反斜杠呢,原因在于需要进行两层转义,首先是re模块表示正则表达式中需要转义一次,其次是python解释器即python的语法还要求再转义一次。也是因为这个原因,对于‘\’需要‘\\\\’来匹配。为了表示的简介性,可以使用原始字符串来处理,则上面两例分别可以写为r‘python\.org’和r‘\\’。
  1.3 字符集
  举例说明,例如‘[pj]python’可以匹配‘python’和‘jpython’,[a-zA-Z0-9]可以匹配任意一个大小写字母和数字(注意:是一个)。为了反转字符集,可以将‘^’放在字符串的开头,例如‘[^abc]’可以匹配除a,b,c以为的任意字符。
  注意:如果希望‘.’,‘*’,‘?’这些特殊字符用作文本字符,则需‘\’进行转义,但是在字符集中无必要,尽管是合法的(因为可以调整顺序来解决)。记住以下两个规则:
  a. 如果‘^’出现在字符集的开头则需要转义,除非希望用作字符集反转。
  b. 右中括号‘]’和横线‘-’要么放在字符集开头,要么转义。
  1.4 选择符和子模块
  如果只想匹配‘python’和‘perl’,则可以用选择运算符管道符号‘|’,模式可写为‘python|perl’
  如果不需要对整个模式使用选择运算符,而只需要一部分,可以用括号括起需要的部分,对于上例,表示为‘p(ython|erl)’。括号括起部分称为子模块(subpattren)。
  1.5 可选项和重复子模块
  在子模块后面加上问号,就变成了可选项。
  (pattern)?:允许模式出现0次或者1次。
  (pattern)+:允许模式出现1次或者多次。
  (pattern)*:允许模式出现0次或者多次。
  (pattern){m,n}:允许模式出现m~n次。
  1.6 字符串的开始和结尾
  举例说明,‘www.python.org’和‘python.www.org’中的子字符串‘www’能匹配模式‘w+’,但是只希望‘www.python.org’能匹配,则模式可用‘^w+’表示,如果希望‘python.org.www’中的子字符串‘www’能匹配‘w+’,则模式需写为‘$w+’。
  
  2. re模块的函数
  2.1 .compile
  将正则表达式转换为模式对象,实现更有效率的匹配。



import re
pattern = re.compile('(^w+)\.python\.org')
  2.2 .search(重要)
  在给定字符串中寻找第一个匹配给定正则表达式的子字符串,如果找到会返回一个MatchObject对象,这个对象中的元素可以.group()得到(之后将会介绍group的概念),如果没找到就会返回None。
  可以先判断是否找到再取元素,假设例子中的pattern有两个组,返回第一个组。



have_character = re.search(pattern,text)
if not have_character:
return have_character.group(1)
  2.3 .match
  在给定字符串的开始处匹配正则表达式,例如re.match(‘p’,‘python’)返回为对象MatchObject,即匹配成功,如果要匹配整个字符串,则可以在模式最后加上‘$’符号(代表结尾也匹配)。
  2.4 .split
  根据模式匹配项来分割字符串。类似于字符串的split方法,但是可用正则表达式来带起固定的分隔符字符串,例如允许用任意长度的逗号和空格序列来分割字符串。



text = 'a, b,,,,c  d'
re.split('[, ]+', text)
#['a', 'b', 'c', 'd']
  参数maxsplit可以设定最多的分割次数。



text = 'a, b,,,,c  d'
re.split('[, ]+', text, maxsplit=2)
#['a', 'b', 'c  d']
  2.5 .findall(重要)
  该方法以列表的形式返回所有的匹配项。



pattern = 'a(b+?)c(d+?)e'
items = re.findall(pattern, 'abbcddeabbbcddde')
print items
#items = [('bb', ‘dd’), ('bbb', 'ddd')]
  2.6 .sub(pattern, repl, string[, count=0]) (重要)
  将字符串中所有pattern的匹配项用repl代替。



pattern = re.compile(r'\*([^\*]+)\*')
re.sub(pattern, r'<em>\1</em>', 'Hello, *world*!')
#'Hello, <em>world</em>!'
  在sub函数三个参数中,pattern代表模式,repl代表目标形式,string代表待匹配替换字符串。
  替换步骤:
  a. 用模式pattern套待匹配替换字符串string。
  b. 按照目标形式repl对字符串进行重建(即用目标形式去代替string中与pattern匹配的子字符串)
  sub函数强大功能最重要的体现在于可以在替代字符串中使用组号。(具体内容参考链接:http://stackoverflow.com/questions/5984633/python-re-sub-group-number-after-number, http://www.crifan.com/python_re_sub_detailed_introduction/)



re.sub(r'(foo)', r'\g<1>123', 'foobar')
#'foo123bar'
  2.7 .escape
  如果一个字符串很长且包含很多特殊字符,而不想输入一大堆反斜杠来转义,可以用这个函数对字符串中所有可能被解释为正则运算符的字符进行转义为普通文本字符。
  
  3. 匹配对象和组
  re模块的search,match函数在找到匹配项时都会返回一个MatchObject对象,对于这样一个对象m,可以用m.group()来取某组的信息,如果.group()默认组号为0,则返回整个字符串,.group(1)返回与第一个子模式匹配的单个字符串,.group(2)等等以此类推。
  .start()方法得到对应组的开始索引,.end()得到对应组的结束索引,.span()以元组形式给出对应组的开始和结束位置,括号中填入组号,不填入组号时默认为0。
  
  4. 贪婪和非贪婪模式
  重复运算符在默认条件下是贪婪的。



pattern = r'\*(.+)\*'
re.sub(pattern, r'<em>\1</em>', '*This* is *it*!')
#'<em>This* is *it</em>'
  可见贪婪模式匹配了开始星号到结束星号间的全部内容,包括中间两个星号。
  用(.+?)代替(.+)得到非贪婪模式,它会匹配尽可能少的内容。



pattern = r'\*(.+?)\*'
re.sub(pattern, r'<em>\1</em>', '*This* is *it*!')
#'<em>This</em> is <em>it</em>'
  
  参考资料:
  《Beginning Python From Novice to Professional》
  https://docs.python.org/2.7/library/re.html
  转载请注明:
  http://www.cnblogs.com/wuwenyan/p/4771422.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-145316-1-1.html 上篇帖子: python 网络编程——客户端 下篇帖子: Python实现ORM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表