<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
><channel><title>R2S &#187; 笔记</title> <atom:link href="http://www.road2stat.com/cn/tag/%e7%ac%94%e8%ae%b0/feed" rel="self" type="application/rss+xml" /><link>http://www.road2stat.com/cn</link> <description>江湖一散人</description> <lastBuildDate>Thu, 26 Jan 2012 08:18:36 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>结合豆瓣基础API学习XML包</title><link>http://www.road2stat.com/cn/r_language/rxml.html</link> <comments>http://www.road2stat.com/cn/r_language/rxml.html#comments</comments> <pubDate>Wed, 24 Aug 2011 06:37:00 +0000</pubDate> <dc:creator>Xiao Nan</dc:creator> <category><![CDATA[R]]></category> <category><![CDATA[API]]></category> <category><![CDATA[OAuth]]></category> <category><![CDATA[R语言]]></category> <category><![CDATA[XML]]></category> <category><![CDATA[笔记]]></category> <category><![CDATA[豆瓣]]></category><guid isPermaLink="false">http://www.road2stat.com/cn/?p=878</guid> <description><![CDATA[很久以前在R-Forge上注册过一个RDouban项目, 想用豆瓣提供的API做点好玩的事情. 可惜后来只写了个开头, 感兴趣的童鞋可以无条件认领. 在这里结合豆瓣的基础API, 非常简略地写一下用XML包读数据的基本问题. 1 XPath 花十分钟学习XPath语法. 熟练后可使用Firebug等调试工具直接提取. 此外, 要特别注意XML命名空间问题. (感谢yixuan提醒) 2 Douban API 花n分钟阅读"豆瓣API参考手册". 用户的评论、收藏、广播、豆邮等交互功能往往需要先进行OAuth认证, 建议阅读RFC5849以充分理解OAuth协议. 这块目前也有ROAuth包可以实现, 不过与读数据没什么关系, 此略. 3 Code 读取豆瓣电影/音乐/读书条目的API基本通用, 仅有部分字段细节的区别. 读数据时要注意缺失值和异常值的处理. 由于编码问题, 中文需要使用iconv()函数进行转码. 这里以读取一部电影的三个典型字段为例. 《僵尸肖恩》, IMDB编号tt0365748. require(XML) url = "http://api.douban.com/movie/subject/imdb/tt0365748" movieItemInfo = xmlTreeParse(url, useInternal &#8230; <a href="http://www.road2stat.com/cn/r_language/rxml.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>很久以前在R-Forge上注册过一个<a href="http://rdouban.r-forge.r-project.org/" target="_blank">RDouban项目</a>, 想用豆瓣提供的API做点好玩的事情. 可惜后来只写了个开头, 感兴趣的童鞋可以无条件认领. 在这里结合豆瓣的基础API, 非常简略地写一下用XML包读数据的基本问题.</p><h1>1 XPath</h1><p>花十分钟学习<a href="http://www.w3school.com.cn/xpath/index.asp" target="_blank">XPath</a>语法.<br /> 熟练后可使用Firebug等调试工具直接提取. 此外, 要特别注意<a href="http://www.w3school.com.cn/xml/xml_namespaces.asp" target="_blank">XML命名空间</a>问题. (感谢yixuan提醒)</p><h1>2 Douban API</h1><p>花n分钟阅读"<a href="http://www.douban.com/service/apidoc/reference/" target="_blank">豆瓣API参考手册</a>".<br /> 用户的评论、收藏、广播、豆邮等交互功能往往需要先进行OAuth认证, 建议阅读<a href="http://tools.ietf.org/html/rfc5849" target="_blank">RFC5849</a>以充分理解OAuth协议. 这块目前也有ROAuth包可以实现, 不过与读数据没什么关系, 此略.</p><p><span id="more-878"></span></p><h1>3 Code</h1><p>读取豆瓣电影/音乐/读书条目的API基本通用, 仅有部分字段细节的区别. 读数据时要注意缺失值和异常值的处理. 由于编码问题, 中文需要使用<code>iconv()</code>函数进行转码. 这里以读取一部电影的三个典型字段为例.</p><p>《僵尸肖恩》, IMDB编号tt0365748.</p><p><code>require(XML)<br /> url = "http://api.douban.com/movie/subject/imdb/tt0365748"<br /> movieItemInfo = xmlTreeParse(url, useInternal = TRUE)</code></p><p>名称:<br /> <code>iconv(xmlValue(getNodeSet(doc = movieItemInfo,<br /> path = "//db:attribute[@name='title']",<br /> namespaces = c("db" = "http://www.douban.com/xmlns/"))[[1]]),<br /> from = 'UTF-8', to = '')<br /> # [1] "Shaun of the Dead"</code></p><p>主演:<br /> <code>iconv(sapply(getNodeSet(doc = movieItemInfo,<br /> path = "//db:attribute[@name='cast']",<br /> namespaces = c("db" = "http://www.douban.com/xmlns/")), xmlValue),<br /> from = 'UTF-8', to = '')<br /> #  [1] "西蒙·佩吉"         "尼克·弗罗斯特"     "比尔·奈伊"<br /> #  [4] "凯特·阿什菲尔德"   "彼得·塞拉菲诺威茨" "迪兰·莫兰"<br /> #  [7] "露茜·戴维斯"       "尼古拉·坎宁安"     "基尔·米尔斯"<br /> # [10] "马特·杰恩斯"       "加文·弗格森"       "霍顿·朱庇特"<br /> # [13] "蒂姆·巴格雷"       "阿尔温德·多希"     "拉菲·斯波"<br /> # [16] "索奈尔·达卓" </code></p><p>标签名:<br /> <code>iconv(xpathApply(movieItemInfo,<br /> path = "//db:tag", xmlGetAttr, "name",<br /> namespaces = c("db" = "http://www.douban.com/xmlns/")),<br /> from = 'UTF-8', to = '')<br /> # [1] "黑色幽默"  "英国"      "喜剧"      "僵尸"      "英国电影"  "cult"<br /> # [7] "SimonPegg" "恐怖" </code></p><p>以上, 我们针对XML文档中不同形式的结构, 组合使用了<code>xmlValue()</code>, <code>getNodeSet()</code>, <code>xpathApply()</code>, <code>xmlGetAttr()</code>, <code>sapply()</code>几个函数. 这些, 基本就是XML包和豆瓣API的初阶. 要实现POST数据等等进阶功能, 不妨深入研读XML包的冗长文档.</p> ]]></content:encoded> <wfw:commentRss>http://www.road2stat.com/cn/r_language/rxml.html/feed</wfw:commentRss> <slash:comments>10</slash:comments> </item> <item><title>正则简单笔记</title><link>http://www.road2stat.com/cn/statistics/a_note_of_regular_expression.html</link> <comments>http://www.road2stat.com/cn/statistics/a_note_of_regular_expression.html#comments</comments> <pubDate>Thu, 27 May 2010 17:50:52 +0000</pubDate> <dc:creator>Xiao Nan</dc:creator> <category><![CDATA[统计之路]]></category> <category><![CDATA[regular expression]]></category> <category><![CDATA[正则表达式]]></category> <category><![CDATA[笔记]]></category><guid isPermaLink="false">http://www.road2stat.com/cn/?p=491</guid> <description><![CDATA[1. 元字符 (Metacharacter) 匹配字符串的开始(位置):  ^ 匹配字符串的开始(不受处理多行选项影响):  A 匹配字符串的结束(位置):  $ 匹配字符串的结束(不受处理多行选项影响):  z 匹配字符串的开始/结束(位置):  b 匹配字符串的结束/行尾(不受处理多行选项影响):  Z 匹配数字/字母/下划线/汉字:  w 匹配(阿拉伯)数字:  d 匹配空白符(空格/全角空格/制表符/换行符):  s 匹配横向制表符:  t 匹配竖向制表符:  v 匹配回车:  r 匹配换行符:  n 匹配换页符:  f 匹配任意字符(除换行符n):  . 前述表达式重复任意次:  * 2. 元字符转义 (查找元字符本身) .  *  &#8230; <a href="http://www.road2stat.com/cn/statistics/a_note_of_regular_expression.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<h4>1. 元字符 (Metacharacter)</h4><p>匹配字符串的开始(位置):  ^</p><p>匹配字符串的开始(不受处理多行选项影响):  A</p><p>匹配字符串的结束(位置):  $</p><p>匹配字符串的结束(不受处理多行选项影响):  z</p><p>匹配字符串的开始/结束(位置):  b</p><p>匹配字符串的结束/行尾(不受处理多行选项影响):  Z</p><p>匹配数字/字母/下划线/汉字:  w</p><p>匹配(阿拉伯)数字:  d</p><p>匹配空白符(空格/全角空格/制表符/换行符):  s</p><p>匹配横向制表符:  t</p><p>匹配竖向制表符:  v</p><p>匹配回车:  r</p><p>匹配换行符:  n</p><p>匹配换页符:  f</p><p>匹配任意字符(除换行符n):  .</p><p>前述表达式重复任意次:  *</p><h4>2. 元字符转义 (查找元字符本身)</h4><p>.  *  \  ^  $  等.</p><h4>3. 字符类 (自定义的元字符):  [ ]</h4><p>e.g. [13579] 匹配1或3或5或7或9中的任意一个数字.</p><h4>4. 限定符 (规定表达式重复次数)</h4><p>重复至少0次:  *</p><p>重复至少1次:  +</p><p>重复0次或1次:  ?</p><p>重复n次:  {n}</p><p>重复n次或更多次:  {n,}</p><p>重复m到n次:  {m,n}</p><p>e.g. d{2,9} 匹配2-9位阿拉伯数字.</p><h4>5. 分枝:  |</h4><p>p.s. 分枝条件按照从左到右的顺序测试. 如果已满足了某个分枝, 则匹配结束. 故使用分枝条件时, 一定要反复斟酌各个条件的书写顺序.</p><h4>6. 反义</h4><p>对于元字符, 把元字符里的字母小写换为大写即表示反义. 对于字符类, [^13579] 匹配除了1或3或5或7或9以外的任意字符. 一个不错的例子:</p><p>&lt;a[^&gt;]+&gt; 匹配用尖括号括起来的以a开头的字符串</p><h4>7. 分组:  ( )</h4><p>和编程写公式时多加括号防止写错有点类似. 不过这里的现实意义强得多, 可以用来写出比较复杂的表达式.</p><h4>8. 贪婪/懒惰</h4><p>在正则表达式中, [最先开始的匹配] 拥有最高优先权. 其次才是默认的贪婪匹配原则. 与之对应的懒惰匹配原则:</p><p>重复0次或1次:  ??</p><p>重复至少1次:  +?</p><p>重复m到n次:  {m,n}?</p><p>重复n次以上:  {n,}?</p><p>重复任意次:  *?</p><h4>9. 零宽断言</h4><p>(1) 零宽度正预测先行断言:  (?=exp)</p><p>断言此位置之后能匹配表达式exp</p><p>e.g. bw+(?=lyb) 匹配以ly结尾的字符串的前面部分.</p><p>(2) 零宽度正回顾后发断言:  (?&lt;=exp)</p><p>断言此位置之前能匹配表达式exp</p><p>e.g. (?&lt;=bpre)w+b 匹配以pre开头的字符串的后面部分.</p><p>(3) 零宽度负预测先行断言:  (?!exp)</p><p>断言此位置之后不能匹配表达式exp</p><p>e.g. b((?!exe)w)+b 匹配不包含连续字符串exe的字符串.</p><p>(4) 零宽度负回顾后发断言:  (?&lt;!exp)</p><p>断言此位置之前不能匹配表达式exp</p><p>e.g. (?&lt;!010)d{8} 匹配前面不是010的8位数字.</p><h4>10. 注释</h4><p>(?#注释内容)</p> ]]></content:encoded> <wfw:commentRss>http://www.road2stat.com/cn/statistics/a_note_of_regular_expression.html/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> </channel> </rss>
