<?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>我爱正则表达式 &#187; 杂项</title>
	<atom:link href="http://iregex.org/blog/category/miscellaneous/feed" rel="self" type="application/rss+xml" />
	<link>http://iregex.org</link>
	<description>原创、翻译、转载关于正则表达式的文章</description>
	<lastBuildDate>Fri, 30 Mar 2012 12:50:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/><atom:link rel="hub" href="http://www.feedsky.com/api/RPC2"/><atom:link rel="hub" href="http://blogsearch.google.com/ping/RPC2"/><atom:link rel="hub" href="http://blog.yodao.com/ping/RPC2"/><atom:link rel="hub" href="http://www.feedsky.com/api/RPC2"/><atom:link rel="hub" href="http://www.xianguo.com/xmlrpc/ping.php"/><atom:link rel="hub" href="http://www.zhuaxia.com/rpc/server.php"/><atom:link rel="hub" href="http://rpc.technorati.com/rpc/ping"/><atom:link rel="hub" href="http://rpc.pingomatic.com/"/>		<item>
		<title>饭否新手指南（非官方）</title>
		<link>http://iregex.org/blog/fanfou-the-missing-manual.html</link>
		<comments>http://iregex.org/blog/fanfou-the-missing-manual.html#comments</comments>
		<pubDate>Sat, 27 Nov 2010 08:09:15 +0000</pubDate>
		<dc:creator>rex</dc:creator>
				<category><![CDATA[杂项]]></category>
		<category><![CDATA[fanfou]]></category>

		<guid isPermaLink="false">http://iregex.org/?p=153</guid>
		<description><![CDATA[500多天之后，饭否回来了。这是不是以前的那个饭否不要紧，重要的是你还是那个你。(via@王兴) 有人说：“饭否回来不被阉割就很好了。”要俺看被阉割也成啊，被阉割俺也愿意继续跟它，好... ]]></description>
			<content:encoded><![CDATA[<p>500多天之后，饭否回来了。这是不是以前的那个饭否不要紧，重要的是你还是那个你。(via<a href="http://fanfou.com/wangxing" target="_blank">@王兴</a>) 有人说：“饭否回来不被阉割就很好了。”要俺看被阉割也成啊，被阉割俺也愿意继续跟它，好歹曾经完整过，不像这个新浪围脖儿，还没出生时就是太监了。(via <a href="http://fanfou.com/dawaiwai" target="_blank">@女流氓.exe</a>)</p>
<p>总结了一款非官方的新手指南。老fanfouers请无视。</p>
<p><span id="more-153"></span></p>
<h3 style="color: #127ADB; font-size:14px; padding-bottom:3px; padding-top:3px; margin:1.5em 0 1em;">饭否官方求助页面</h3>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<li><a target="_blank" href="http://fanfou.com/help">http://fanfou.com/help</a></li>
<li><a target="_blank" href="http://help.fanfou.com/faq.html">http://help.fanfou.com/faq.html</a></li>
</blockquote>
<h3 style="color: #127ADB; font-size:14px; padding-bottom:3px; padding-top:3px; margin:1.5em 0 1em;">注册新帐户</h3>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<p>现在饭否采用了邀请制注册方式。可以使用下面的邀请码：</p>
<p><a target="_blank" href="http://fanfou.com/register/cDzSYlKOY6MX">http://fanfou.com/register/cDzSYlKOY6MX</a> （<a href="http://fanfou.com/zhasm" target="_blank">@.rex</a>提供）</p>
<p>我猜测如果A提供注册链接，供B注册的话，A和B自动相互Follow。这能够解释为什么有的人的friends 和 followers 同时上升，而自己并没有主动去follow 谁的。猜测而已。求官方证实。</p>
<p>PS: 听一下<a href="http://fanfou.com/lydon" target="_blank">@带三个表</a> 的心声：“为了方便大家注册微博，我在博客上把邀请链接贴出来了。所以大家进来后默认我关注你。但是现在有将近三千人被我关注，我实在看不过来，就把不认识的人取消了。如果您将来写的好看，我还会关注。”</p>
</blockquote>
<h3 style="color: #127ADB; font-size:14px; padding-bottom:3px; padding-top:3px; margin:1.5em 0 1em;">饭否登录</h3>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<li>电脑登录页面：</li>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<ul>
<li><a target="_blank" href="http://fanfou.com/index">http://fanfou.com/index</a></li>
<li><a target="_blank" href="http://fanfou.com/home">http://fanfou.com/home</a></li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>官方主页：</span><a href="http://fanfou.com" title="我爱正则表达式" target="_blank">http://fanfou.com</a> 该页面目前仍是《岁月神偷》的图片。点击该图片后，就会出现登录框。</li>
</ul>
</blockquote>
<li>手机登录</li>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<ul>
<li>请访问<a target="_blank" href="http://m.fanfou.com/home">http://m.fanfou.com/home</a></li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>iPhone</span> 版的登录地址：<a href='http://i.fanfou.com' target="_blank">http://i.fanfou.com</a>。</li>
</ul>
</blockquote>
<li>结合<a href="http://fanfou.com/moon" target="_blank">@穆荣均</a> 所说，可以使用下面的登录名：</li>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<ul>
<li>自己的短网址（即个性域名，例如<a target="_blank" href="http://fanfou.com/zhasm">http://fanfou.com/zhasm</a> ，就使用 zhasm 来登录）；大小写无关。</li>
<li>自己的邮箱</li>
<li>之前登记过的手机号</li>
</ul>
</blockquote>
</blockquote>
<h3 style="color: #127ADB; font-size:14px; padding-bottom:3px; padding-top:3px; margin:1.5em 0 1em;">发消息的正确格式</h3>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;' >提及某人</span> 消息正文@用户名称 半角空格 其余消息。@号为半角。</li>
<li>@号之前可以没有空格，但是用户名称后一定要有空格才可以。最简单的办法是直接点击页面上的回复与转发。</li>
<li>@号之后是用户名称，而不是ID（或曰短网址）。这与推特的做法是截然不同的。</li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>贴网址</span> 饭否对于网址的解析，同样比推特的更智能。一般情况下，网址前后都没有空格分隔也能正确解析。但是两端各加一个空格，是最优雅的方式，在任何微博中都通行无阻。</li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>@与回复的关系</span>受<a href="http://fanfou.com/kndanny">@布丁丁丁</a>的委托，面向从新浪刚转至饭否的朋友，解释一下@与回复的关系。 <br />
    可能在新浪两者是没有直接关系的。在饭否，可以这样简单解释一下：如果饭否消息里有N个 @饭友名称 ，则这N位饭友都会在饭否界面 @提到我的 一栏看到通知；如果饭友A给他的好友B发了一条消息：&#8221;@B &#8230;&#8230;&#8221;，则只有既关注A又关注B的人才能在自己的主页看到这条消息。如果A发的不是以＠开头的消息，例如：&#8221;something @B &#8230;&#8230;&#8221;，则A的所有听众都会看到这条消息。一般而言，如果只是针对B发的消息，较为礼貌的格式就是&#8221;@B &#8230;&#8221;，这样既不影响B收到这条消息，又不打扰其他饭友。但愿我解释清楚了。没关系，没那么复杂。尝试一下你就知道。</li>
</blockquote>
<h3 style="color: #127ADB; font-size:14px; padding-bottom:3px; padding-top:3px; margin:1.5em 0 1em;">上传图片</h3>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<li>电脑上传</li>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<ul>
<li><a target="_blank" href="http://m.fanfou.com/photo.upload">http://m.fanfou.com/photo.upload</a></li>
</ul>
</blockquote>
<li>手机上传</li>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<ul>
<li>下载手机拍拍1.10，手机可以访问这里<a target="_blank" href="http://m.fanfou.com/paipai">http://m.fanfou.com/paipai</a></li>
<li>或者这里：<a target="_blank" href="http://fanfou.com/paipai">http://fanfou.com/paipai</a></li>
<li>或者这里：诺基亚(s60/v3/v5)安装包直接地址<a target="_blank" href="http://static.fanfou.com/FanfouPaipai_1.10.sisx">http://static.fanfou.com/FanfouPaipai_1.10.sisx</a></li>
<li>手机拍拍是一个有口皆杯的应用。再次赞赏。</li>
<li>本人的手机绑定后大约4个小时生效。如果你的手机短时间内未绑定成功，不要着急。</li>
</ul>
</blockquote>
</blockquote>
<h3 style="color: #127ADB; font-size:14px; padding-bottom:3px; padding-top:3px; margin:1.5em 0 1em;">API以及应用</h3>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>爱饭样式头像生成器2.0</span>地址在这里，<a href="http://avatar.ifanfou.com" title="我爱正则表达式" target="_blank">avatar.ifanfou.com</a>，非常有爱，敬请试用。 </li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>饭否Apps</span>寻找好玩的应用<a target="_blank" href="http://help.fanfou.com/apps.html">http://help.fanfou.com/apps.html</a></li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>饭否博客导入</span>饭否博客导入是把博客上新发表的文章自动导入到饭否的工具。当你的博客新发表一篇文章，饭否博客导入会帮你自动发布一条消息到饭否。<a target="_blank" href="http://daoru.fanfou.com/l">http://daoru.fanfou.com/</a></li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>饭否 API 应用书签</span>这是饭否官方收集的，保存在delicious上的书签集合。相当之丰富。<a target="_blank" href="http://www.delicious.com/fanfou/API%E5%BA%94%E7%94%A8">饭否 API 应用书签</a></li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>爱饭</span>这是一款非常不错的饭否客户端。因为有Adobe Air的支持，该应用可以在Windows, Linux, 以及Mac下使用。界面美观，功能贴心。</li>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<ul>
<li><a href="http://code.google.com/p/ifan/">code.google.com</a></li>
</ul>
</blockquote>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>爱饭官方</span>爱饭的作者是<a href="http://fanfou.com/realazy" target="_blank">@realazy</a> 同学，请你关注爱饭的帐号：<a href="http://fanfou.com/ifan">@ifan</a> 。</li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>iPhone客户端</span><br />
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<ul>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'><a href="http://fanfou.com/wanhuai" target="_blank">@郭万怀</a>提供的链接</span><a href="http://u.115.com/file/f8f61b85c">115.com</a>, 并提示，只能供已越狱的iPhone手机使用。App Store对上传的软件要求服务器要稳定，现在我们刚开始，服务器要调试。所以，他暂时还没有上传到App Store官方网站。如果有新消息，会在饭否里第一时间通知。如果有其它同学制作了iPhone客户端，我们也会第一时间通知大家。(via <a href="http://fanfou.com/wanhuai" target="_blank">@郭万怀</a>)
        </li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>饭友Tiger 提供提供的链接</span><a href="http://bbs.weiphone.com/read-htm-tid-1382320.html">bbs.weiphone.com</a>没有测试。请自行尝试。</li>
</ul>
</blockquote>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>FanFox(Firefox的饭否插件)</span>饭友<a href="http://fanfou.com/ray..." title="我爱正则表达式" target="_blank">@雷小雷</a>提供的链接。在这里<a href="http://u.115.com/file/t6e58d9786" title="我爱正则表达式" target="_blank">115.com</a>。已经修正API问题。这是一款非常好用的插件，推荐以Firefox为主浏览器的朋友使用。附fanfox的官网地址<a href="http://panweizeng.com/fanfox" title="我爱正则表达式" target="_blank">panweizeng.com</a>。
    </li>
</blockquote>
<h3 style="color: #127ADB; font-size:14px; padding-bottom:3px; padding-top:3px; margin:1.5em 0 1em;">饭否公约</h3>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>修改头像</span>建议新注册用户尽快修改一下头像，不要使用默认的问号头像。这个头像出现别人的好友表里的话，对别人不礼貌，自己也没有起到识别宣传的作用。而且，即使是被人加为好友，也有可能被清理掉。</li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>修改ID</span> ID就是你的短域名。相比与上一项，这个不是必需修改的，而且只有修改一次的机会。想好了再改。</li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>个人介绍</span>个人介绍是你在饭否的开场白，是你准备向其它饭友介绍一个怎样的自己，是其他饭友决定follow你与否的重要参考。因此，花点心思好好介绍一下自己，可能会迅速赢得不少关注。</li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>尽量不版聊</span>这个只是提一个建议。视你自己的习惯，以及你的好友对你的容忍度而定。如果你在话痨圈，这个约定就很宽松；如果你的好友都有time line洁癖，喋喋不休的人会被unfo 或 block。</li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>加删随意</span>你有follow别人的权利（私密型除外），但是对方没有follow back的义务。多分享一些有趣有用的话题，自然会吸引更多的人follow你。</li>
</blockquote>
<h3 style="color: #127ADB; font-size:14px; padding-bottom:3px; padding-top:3px; margin:1.5em 0 1em;">导航</h3>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>排行榜</span>大牛们聚集的地方。你如果初来乍到，不知道应该follow谁，那么不妨来这里看看，或许能找到不少。<a target="_blank" href="http://bang.fanfou.com/">http://bang.fanfou.com/</a>。“有的人很重要，你一定要follow；有的人更重要，你不必follow，自会有人将他的话转发给你。”(via<a href="http://fanfou.com/%E5%92%8C%E8%8F%9C%E5%A4%B4" target="_blank">@和菜头</a> )<br/><br />
    另外，你也可以给自己加上标签（最多三个）。</li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>可能关注的人</span>貌似是根据你现在follow的用户群，帮你推荐一些新朋友。与“豆瓣猜”类似。<a target="_blank" href="http://fanfou.com/userpush">http://fanfou.com/userpush</a></li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>小调查</span><a target="_blank" href="http://spreadsheets.google.com/viewform?formkey=dHp4ZlhOWlQ3bml0QjZFZU9nYWplUXc6MQ">饭否新增功能需求小调查</a>。参与一下吧，让饭否更好用～</li>
</blockquote>
<h3 style="color: #127ADB; font-size:14px; padding-bottom:3px; padding-top:3px; margin:1.5em 0 1em;">饭否的新特性</h3>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>标签</span>使用两个半角井号 ## 将中文或英文词包围起来即可。例如，#fanofu# #应用#. 将来服务器布署完毕之后，可以通过http://fanfou.com/q/TAG_KEYWORD 的方式访问该标签下的消息集后。</li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>压缩网址: ye.ma</span> 消息中的长网址自动被压缩为ye.ma短网址 。这是自动进行的，但是却不够智能。原因是在你输入长网址时，你只能输入 140-length(长网址) 的字数，而不是 140-length(短网址) 个字。解决办法是不用它，先使用id.gd等压缩好了，再来输入。如果你需要的话。不过，无论使用何种压缩网址，都可以方便转发。
    </li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>logo</span>加上了“测试版”。</li>
</blockquote>
<h3 style="color: #127ADB; font-size:14px; padding-bottom:3px; padding-top:3px; margin:1.5em 0 1em;">问答(结合饭否金牌客户<a href="http://fanfou.com/wanhuai" target="_blank">@郭万怀</a>的留言整理; 文中的“我们”指饭否官方)</h3>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>为什么饭否关闭期间有人可以一直更新饭否消息?</span><br />
    在此期间其实仍然可以使用发短信至13489133650的方式锲而不舍地更新自己的状态。</li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>为什么收不到验证邮箱？</span>非常抱歉，因为饭否这几天来的人超多，服务器无法一下子发完那么多邮件，存在严重延迟和丢失的现象。我们的工程师正在努力解决，希望本周内有所改善，让你收到验证邮箱的电子邮件。
    </li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>api什么时候开放？</span>对不起，这是我们的错。一开始没有预料到会有那么多人回来，以为最多就是二、三十万的样子。刚开始内测，服务器就被压垮了。经过工程师的紧急处理，目前可以保证网页访问，消灭白屏现象。我们希望在本周（11月末～12月初）晚些时候能够开放API服务，祈祷别把服务器又拉垮了。 </li>
<li><span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>首页新关注我的用户列表怎么不见了？</span>由于系统压力，之前暂时关闭了这个功能，今天（11月29日）已恢复正常。</li>
</blockquote>
<p><br/></p>
<p>如果您想到其它，请补充。谢谢。<span class='title' style='color: #127ADB; font-weight: bold; margin-right: 5px;'>本文持续更新中。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://iregex.org/blog/fanfou-the-missing-manual.html/feed</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>anti spam杂谈</title>
		<link>http://iregex.org/blog/anti-spam.html</link>
		<comments>http://iregex.org/blog/anti-spam.html#comments</comments>
		<pubDate>Sun, 15 Aug 2010 02:03:50 +0000</pubDate>
		<dc:creator>rex</dc:creator>
				<category><![CDATA[杂项]]></category>
		<category><![CDATA[akismet]]></category>
		<category><![CDATA[antispam]]></category>
		<category><![CDATA[discuz]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://iregex.org/?p=140</guid>
		<description><![CDATA[本文是一篇随笔，将email的anti spam技术和论坛的防灌水结合在一起讨论。从技术层面出发。不涉及其它。 据说德国有这样一句谚语：没有泡沫的啤酒不是好啤酒。推而广知，可以得到：没人灌... ]]></description>
			<content:encoded><![CDATA[<p>本文是一篇随笔，将email的anti spam技术和论坛的防灌水结合在一起讨论。从技术层面出发。不涉及其它。</p>
<p><span id="more-140"></span></p>
<p>据说德国有这样一句谚语：没有泡沫的啤酒不是好啤酒。推而广知，可以得到：没人灌水的论坛不是好论坛，没有垃圾邮件的邮件系统不是好系统（至少是不知名的系统／电邮地址），没有病毒骚扰的OS不是好的OS，等等。但是，只有泡沫的啤酒也不是什么好啤酒吧？关键是将不需要的内容控制在可以允许的范围内。单就开论坛、维护垃圾邮件的角度出发，审核技术还是很有用，很有必要的。否则，其地盘很快就会淹没在垃圾广告的汪洋大海之中。自己的论坛，自己发广告是为了维持网站开销，但是不请自来的广告是无法容忍的。</p>
<h3 style="color: #127ADB; font-size:14px; padding-bottom:3px; padding-top:3px; margin:1.5em 0 1em;">Spam</h3>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<p>
    垃圾邮件有两个特点：<br />
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<ol>
<li>
                <strong>大量</strong>。一封两封垃圾邮件，个人用户可能比较在意，但是对于服务器来说，邮件数以百万计。在这样大的分母下，如果偶然有一两封垃圾邮件被判为合法邮件，或者合法邮件被误判为垃圾，实属正常。
            </li>
<li><strong>不需要</strong>。需要与否，取决于用户的主观判断。大家都认为 porn 和 drug 内容是spam，但是也不排除有人将这类邮件标为 ham 的。
            </li>
</ol>
</blockquote>
</blockquote>
<h3 style="color: #127ADB; font-size:14px; padding-bottom:3px; padding-top:3px; margin:1.5em 0 1em;">Anti-Spam</h3>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<p>常用的反垃圾邮件有以下几种方法：
</p>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<ul>
<li>静态关键词列表。如果邮件头（标题，收发件人，电邮地址，正文）含某些关键词（例如Viagra），就将邮件标为Spam 或 Ham。这是最简单的方式，为各大邮件厂商所采用，包括Gmail。它最大的优点是快。缺点多多，一是需要维护（增／改／删 关键词），二是准确率不高（含黑名单中关键词的邮件未必全是Spam，反之亦然），三是不能识别含有干扰因素的邮件。例如，V1agra，发*漂，含这种关键词的邮件，人眼立即能识别它是垃圾邮件，但是静态法就傻了。
        </li>
<li>正则表达式规则表。与静态关键词列表相反，它速度稍慢，但是极其强大和灵活。对于邮件头的扫描，效果尤佳：邮件头是有规律可循的，尤其是对于大量的垃圾邮件而言，不可能不在邮件头中留下蛛丝马迹。<br />
        但是这种方法也有其短板。与上述方法类似，它也需要专人来维护，而且无论从配置难度到维护成本，都远高于前者。对于邮件的正文，正则表达式的扫描速度比较缓慢，尤其是对于精心设计了干扰因素的垃圾邮件。有相当大的一部分邮件，人眼看上去确实也是垃圾邮件，但是使用正则表达式也不好写规则。一个新的规则写手，可能要在准确率与查杀总量的折哀上花费很长一段时间才能掌握其规律。
        </li>
<li>贝叶斯概率法。若已知某些字词经常出现在垃圾邮件中，却很少出现在合法邮件中，当一封邮件含有这些字词时，那么link它是垃圾邮件的可能性就很大。参考此文。<a href="http://home.q.yesky.com/space-4148078-do-blog-id-412454.html" title="我爱正则表达式" target="_blank">贝叶斯过滤技术</a>。<br />
        它最大的优点是，只要有足够健壮的算法，足够的样本空间，其准确率是非常高的。同时，它主要依赖于机器学习，而不需要后期大量的人工干预。</li>
</ul>
</blockquote>
<p>国内有的网站，其内容过滤系统极其简单粗暴，只要出现单个汉字“日”，“操”，“干”等等字眼，就当作垃圾邮件／评论对待，而不分析具体上下文，实在令人又好气又好笑。又有，《百家姓》的常见姓氏用字本身不是垃圾字眼或违禁词汇，如果将其加入静态列表，就会导致连萝卜也无法搜索。其实，用一点点正则表达式（环视）或贝叶斯的技术（条件概率），就能提高过滤质量，皆大欢喜。当然，如果要扫描亿万级的网页，速度的要求肯定要优先于准确度，某些情况下只能做到大致靠谱罢了。然而，频频出错的系统，即使快一点点又有何用（成语：南辕北辙）？ 不过，从来都是宁枉勿纵的。
</p>
<p>由于静态法的特点，注定了列表只能向管理员开放，而对普通游客讳莫如深。这导致了另一种现象：该贴无法显示，是因为含有某关键词。至于哪些词是关键词，不好意思，不能告诉你，怕这个列表一旦公开，想发类似内容的人就能轻易绕过。那就有劳管理员们从严自省，并用心地揣摩圣意。</p>
<p> 动静结合，人、机结合，系统才能越用越新。@chunzi说得很形象：反垃圾邮件的过程，不是拼耐力的马拉松赛跑，而是适者生存的进化。总是魔已先高一丈，道才一尺尺增高，并最终压住魔。同时有新的魔即将出现。</p>
</blockquote>
<h3 style="color: #127ADB; font-size:14px; padding-bottom:3px; padding-top:3px; margin:1.5em 0 1em;">一些工具</h3>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<p>如果你说自己的邮箱里其实没多少垃圾邮件，或者即使有也已经自动被转入垃圾箱了，那么有两种可能。一是你所用的邮箱系统本身的反垃圾邮件系统做得不错（有太多太多各式各样的明显的垃圾邮件在进入你的邮箱之前，已经被服务器端给block了）。二是你的邮址没有被爬虫抓到或算出来。</p>
<li>
    <a href="http://spamassassin.apache.org/" title="我爱正则表达式" target="_blank">Spamassassin</a>是一套不错的反垃圾邮件系统。免费，与Apache紧密结合，强大的正则式支持。国内有一个组织专门动态维护一个中文的规则表，在<a href="http://www.ccert.edu.cn/spam/sa/Chinese_rules.htm" title="我爱正则表达式" target="_blank">这里</a>，可以参考。Spamassassin其实也有贝叶斯模块，只是它以正则知名罢了。
    </li>
<li>WordPress 有个 Akismet 插件是用来block 博客上的垃圾评论的。这个设置起来比较傻瓜（只需要申请一个API）即可，效果比较智能，完全不用用户再手工添加任何规则。对于出错的判断，用户有义务提交给Akismet官方，方便它学习新的变种。应该说，用户提交的漏判或误判，是必不可少的语料库。没有用户提交，Akismet就会一根筋地按照既定的思路继续犯同样的错误。
    </li>
</blockquote>
<h3 style="color: #127ADB; font-size:14px; padding-bottom:3px; padding-top:3px; margin:1.5em 0 1em;">个人应用</h3>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<p>国人开发的Discuz是一款不错的论坛程序。不过，它没有较好的反垃圾模块，我一直在颇厌其烦地删除spam和spammer。看了一下Ak的官网，几乎国外知名的论坛程序都有Ak的插件了。我研究了dz的数据结构，使用python写了一个脚本，定时搜索新贴子，将其提交到Ak做判断。如果判为垃圾，则屏蔽贴子，并对该会员实施减分操作。刚开始试用，效果还可以。其实可以做成原生的php插件，集成到dz中的。</p>
<p>流程很直接：</p>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<ul>
<li>定时搜索最新贴子；</li>
<li>对于每一个新贴子:</li>
<blockquote style="border-left:2px solid #DDDDDD; margin:15px 30px 0 10px; padding-left:20px;">
<ul>
<li>提交给Akismet作测试。</li>
<li>如果不是垃圾，忽视之。</li>
<li>如果是垃圾，将该贴转为仅管理员可见。同时将该用户扣分。</li>
</ul>
</blockquote>
<li>总合一下应该执行的操作，执行SQL, Commit。</li>
<li>生成报表，发邮件给管理员。</li>
</ul>
</blockquote>
<p>Ak的开发者页面在这里 <a href="http://akismet.com/development/" title="我爱正则表达式" target="_blank">Akismet API Documentation</a>。我用了其中的<a href="http://www.voidspace.org.uk/python/modules.shtml" title="我爱正则表达式" target="_blank">Python 模块</a> 将其封装为一个class，只需要init和check即可：</p>
<div class="codecolorer-container python mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br /></div></td><td><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span><br />
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span><br />
<span style="color: #808080; font-style: italic;">#</span><br />
<span style="color: #808080; font-style: italic;">#author: &nbsp; &nbsp; &nbsp; &nbsp; rex</span><br />
<span style="color: #808080; font-style: italic;">#blog: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; http://iregex.org</span><br />
<span style="color: #808080; font-style: italic;">#filename &nbsp; &nbsp; &nbsp; &nbsp;comment.py</span><br />
<span style="color: #808080; font-style: italic;">#created: &nbsp; &nbsp; &nbsp; &nbsp;2010-08-14 15:58</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">from</span> akismet <span style="color: #ff7700;font-weight:bold;">import</span> Akismet<br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> Comment<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">api</span><span style="color: #66cc66;">=</span>Akismet<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">api</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">api</span>.<span style="color: black;">verify_key</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'No Valid Akismet API'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> init<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> comment<span style="color: #66cc66;">,</span> <span style="color: #dc143c;">user</span><span style="color: #66cc66;">=</span><span style="color: #483d8b;">''</span><span style="color: #66cc66;">,</span> ip<span style="color: #66cc66;">=</span><span style="color: #483d8b;">''</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">email</span><span style="color: #66cc66;">=</span><span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: #dc143c;">user</span><span style="color: #66cc66;">=</span><span style="color: #dc143c;">user</span>.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;utf-8&quot;</span><span style="color: black;">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">comment</span><span style="color: #66cc66;">=</span>comment.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;utf-8&quot;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">ip</span><span style="color: #66cc66;">=</span>ip<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: #dc143c;">email</span><span style="color: #66cc66;">=</span><span style="color: #dc143c;">email</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> check<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">api</span>.<span style="color: black;">comment_check</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">comment</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #483d8b;">'comment_author'</span>: <span style="color: #008000;">self</span>.<span style="color: #dc143c;">user</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #483d8b;">'comment_author_email'</span>:<span style="color: #008000;">self</span>.<span style="color: #dc143c;">email</span><span style="color: #66cc66;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #483d8b;">'user_ip'</span>:<span style="color: #008000;">self</span>.<span style="color: black;">ip</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #483d8b;">'user_agent'</span>:<span style="color: #483d8b;">&quot;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8&quot;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#125;</span><span style="color: #66cc66;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#41;</span></div></td></tr></tbody></table></div>
<p>这是程序的主要部分</p>
<div class="codecolorer-container python mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br /></div></td><td><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span><br />
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span><br />
<span style="color: #808080; font-style: italic;">#</span><br />
<span style="color: #808080; font-style: italic;">#author: &nbsp; &nbsp; &nbsp; &nbsp; rex</span><br />
<span style="color: #808080; font-style: italic;">#blog: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; http:#iregex.org</span><br />
<span style="color: #808080; font-style: italic;">#filename &nbsp; &nbsp; &nbsp; &nbsp;dzas.py</span><br />
<span style="color: #808080; font-style: italic;">#created: &nbsp; &nbsp; &nbsp; &nbsp;2010-08-14 15:20</span><br />
<br />
<span style="color: #808080; font-style: italic;">#anti spam for discuz! bbs.</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">from</span> comment <span style="color: #ff7700;font-weight:bold;">import</span> Comment <span style="color: #ff7700;font-weight:bold;">as</span> C<br />
<span style="color: #ff7700;font-weight:bold;">from</span> eml <span style="color: #ff7700;font-weight:bold;">import</span> Email<br />
<br />
<span style="color: #808080; font-style: italic;">#########################################################</span><br />
<span style="color: #808080; font-style: italic;">#global settings</span><br />
send_email_log <span style="color: #66cc66;">=</span><span style="color: #ff4500;">1</span><br />
<br />
dbhost <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'yourhost.website.com'</span><span style="color: #66cc66;">;</span><br />
dbuser <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'db_user'</span><span style="color: #66cc66;">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
dbpw <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'yourpassword'</span><span style="color: #66cc66;">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
dbname <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'dbname'</span><span style="color: #66cc66;">;</span> &nbsp; &nbsp;<br />
dbpre<span style="color: #66cc66;">=</span><span style="color: #483d8b;">'cdb_'</span><br />
<br />
<br />
<span style="color: #808080; font-style: italic;">#punish : punish for the user if he/she publish spam</span><br />
punish_score<span style="color: #66cc66;">=</span><span style="color: #ff4500;">2</span><br />
<br />
<span style="color: #808080; font-style: italic;">#now is 2 hours; you may change</span><br />
sql<span style="color: #66cc66;">=</span><span style="color: black;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #483d8b;">'last_n_hr'</span>:<span style="color: #483d8b;">'''select `%sposts`.pid, `%sposts`.author, `%sposts`.message, `%sposts`.useip, `%smembers`.email, authorid from `%sposts`, `%smembers` where dateline&gt;UNIX_TIMESTAMP(now())-2*3600 and `%sposts`.author=`%smembers`.username order by pid desc;'''</span> % <span style="color: black;">&#40;</span>dbpre<span style="color: #66cc66;">,</span>dbpre<span style="color: #66cc66;">,</span>dbpre<span style="color: #66cc66;">,</span>dbpre<span style="color: #66cc66;">,</span>dbpre<span style="color: #66cc66;">,</span>dbpre<span style="color: #66cc66;">,</span>dbpre<span style="color: #66cc66;">,</span>dbpre<span style="color: #66cc66;">,</span>dbpre<span style="color: #66cc66;">,</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: #483d8b;">'hide'</span>:<span style="color: #483d8b;">'update %sposts set `status`= 1 where pid in (%s);'</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: #483d8b;">'punish'</span>:<span style="color: #483d8b;">'update %smembers set credits=credits-%s where uid=%s;'</span><span style="color: #66cc66;">,</span> <br />
&nbsp; &nbsp; <span style="color: #483d8b;">'find_hided'</span>:<span style="color: #483d8b;">&quot;SELECT * FROM &nbsp;`%sposts` WHERE &nbsp;`status`=1;&quot;</span>%<span style="color: black;">&#40;</span>dbpre<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span><br />
<span style="color: black;">&#125;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> MySQLdb<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> init_db<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; db<span style="color: #66cc66;">=</span>MySQLdb.<span style="color: black;">connect</span><span style="color: black;">&#40;</span>host<span style="color: #66cc66;">=</span>dbhost<span style="color: #66cc66;">,</span> <span style="color: #dc143c;">user</span><span style="color: #66cc66;">=</span>dbuser<span style="color: #66cc66;">,</span> passwd<span style="color: #66cc66;">=</span>dbpw<span style="color: #66cc66;">,</span>db<span style="color: #66cc66;">=</span>dbname<span style="color: #66cc66;">,</span> charset<span style="color: #66cc66;">=</span><span style="color: #483d8b;">'utf8'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> db<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> hide_spam<span style="color: black;">&#40;</span>db<span style="color: #66cc66;">,</span> spam<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; c<span style="color: #66cc66;">=</span>db.<span style="color: black;">cursor</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; sql_str<span style="color: #66cc66;">=</span>sql<span style="color: black;">&#91;</span><span style="color: #483d8b;">'hide'</span><span style="color: black;">&#93;</span> % <span style="color: black;">&#40;</span>dbpre<span style="color: #66cc66;">,</span><span style="color: #483d8b;">','</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span>spam<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; c.<span style="color: black;">execute</span><span style="color: black;">&#40;</span>sql_str<span style="color: black;">&#41;</span> <br />
&nbsp; &nbsp; db.<span style="color: black;">commit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> punish<span style="color: black;">&#40;</span>db<span style="color: #66cc66;">,</span>score<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; c<span style="color: #66cc66;">=</span>db.<span style="color: black;">cursor</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> u <span style="color: #ff7700;font-weight:bold;">in</span> score.<span style="color: black;">keys</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; s<span style="color: #66cc66;">=</span>score<span style="color: black;">&#91;</span>u<span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; sql_str<span style="color: #66cc66;">=</span>sql<span style="color: black;">&#91;</span><span style="color: #483d8b;">'punish'</span><span style="color: black;">&#93;</span> % <span style="color: black;">&#40;</span>dbpre<span style="color: #66cc66;">,</span>s*punish_score<span style="color: #66cc66;">,</span>u<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; c.<span style="color: black;">execute</span><span style="color: black;">&#40;</span>sql_str<span style="color: black;">&#41;</span> <br />
&nbsp; &nbsp; db.<span style="color: black;">commit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> get_msg<span style="color: black;">&#40;</span>db<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; c<span style="color: #66cc66;">=</span>db.<span style="color: black;">cursor</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; c.<span style="color: black;">execute</span><span style="color: black;">&#40;</span>sql<span style="color: black;">&#91;</span><span style="color: #483d8b;">'last_n_hr'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; records<span style="color: #66cc66;">=</span> c.<span style="color: black;">fetchall</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; result<span style="color: #66cc66;">=</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> r <span style="color: #ff7700;font-weight:bold;">in</span> records:<br />
&nbsp; &nbsp; &nbsp; &nbsp; result.<span style="color: black;">append</span><span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'pid'</span>:r<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'user'</span>:r<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'msg'</span>:r<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'ip'</span>:r<span style="color: black;">&#91;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'email'</span>:r<span style="color: black;">&#91;</span><span style="color: #ff4500;">4</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'uid'</span>:r<span style="color: black;">&#91;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#125;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> result<br />
<br />
<span style="color: #808080; font-style: italic;">#send log to admin. change the global variable </span><br />
<span style="color: #808080; font-style: italic;">#send_email_log = 1 or 0 to enable/disable</span><br />
<span style="color: #ff7700;font-weight:bold;">def</span> report<span style="color: black;">&#40;</span>spam<span style="color: #66cc66;">,</span> score<span style="color: black;">&#41;</span>:<br />
<br />
&nbsp; &nbsp; sub<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;%s spams caputured&quot;</span> % <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>spam<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; body<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;spammers including: %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> % <span style="color: #483d8b;">', '</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span> <span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>m<span style="color: black;">&#91;</span><span style="color: #483d8b;">'user'</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">for</span> m <span style="color: #ff7700;font-weight:bold;">in</span> spam<span style="color: black;">&#93;</span> <span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; body+<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;spam pids including: %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> % <span style="color: #483d8b;">', '</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span> <span style="color: black;">&#91;</span> <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>m<span style="color: black;">&#91;</span><span style="color: #483d8b;">'pid'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> m <span style="color: #ff7700;font-weight:bold;">in</span> spam<span style="color: black;">&#93;</span> <span style="color: black;">&#41;</span><br />
&nbsp;<br />
&nbsp; &nbsp; body+<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;useful sql: %s<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> % sql<span style="color: black;">&#91;</span><span style="color: #483d8b;">'find_hided'</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; body+<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;spam preview: <span style="color: #000099; font-weight: bold;">\n</span>%s&quot;</span> % <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span> m<span style="color: black;">&#91;</span><span style="color: #483d8b;">'msg'</span><span style="color: black;">&#93;</span>.<span style="color: black;">splitlines</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">for</span> m <span style="color: #ff7700;font-weight:bold;">in</span> spam<span style="color: black;">&#41;</span> <br />
&nbsp; &nbsp; Email<span style="color: black;">&#40;</span>sub.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;utf-8&quot;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span>body.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;utf-8&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <br />
<br />
<span style="color: #808080; font-style: italic;">#the core part</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> anti_spam<span style="color: black;">&#40;</span>db<span style="color: #66cc66;">,</span> msgs<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; c<span style="color: #66cc66;">=</span>C<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; spam<span style="color: #66cc66;">=</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; score<span style="color: #66cc66;">=</span><span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>.<span style="color: black;">fromkeys</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>m<span style="color: black;">&#91;</span><span style="color: #483d8b;">'uid'</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">for</span> m <span style="color: #ff7700;font-weight:bold;">in</span> msgs<span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> m <span style="color: #ff7700;font-weight:bold;">in</span> msgs:<br />
&nbsp; &nbsp; &nbsp; &nbsp; c.<span style="color: black;">init</span><span style="color: black;">&#40;</span>m<span style="color: black;">&#91;</span><span style="color: #483d8b;">'msg'</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span> m<span style="color: black;">&#91;</span><span style="color: #483d8b;">'user'</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span> m<span style="color: black;">&#91;</span><span style="color: #483d8b;">'ip'</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span> m<span style="color: black;">&#91;</span><span style="color: #483d8b;">'email'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> c.<span style="color: black;">check</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; score<span style="color: black;">&#91;</span>m<span style="color: black;">&#91;</span><span style="color: #483d8b;">'uid'</span><span style="color: black;">&#93;</span><span style="color: black;">&#93;</span>+<span style="color: #66cc66;">=</span><span style="color: #ff4500;">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; spam.<span style="color: black;">append</span><span style="color: black;">&#40;</span>m<span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> s <span style="color: #ff7700;font-weight:bold;">in</span> score.<span style="color: black;">keys</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> score<span style="color: black;">&#91;</span>s<span style="color: black;">&#93;</span><span style="color: #66cc66;">==</span><span style="color: #ff4500;">0</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">del</span> score<span style="color: black;">&#91;</span>s<span style="color: black;">&#93;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> score <span style="color: #ff7700;font-weight:bold;">and</span> spam: <br />
&nbsp; &nbsp; &nbsp; &nbsp; hide_spam<span style="color: black;">&#40;</span>db<span style="color: #66cc66;">,</span> <span style="color: black;">&#91;</span><span style="color: #008000;">str</span><span style="color: black;">&#40;</span>m<span style="color: black;">&#91;</span><span style="color: #483d8b;">'pid'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> m <span style="color: #ff7700;font-weight:bold;">in</span> spam<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; punish<span style="color: black;">&#40;</span>db<span style="color: #66cc66;">,</span> score<span style="color: black;">&#41;</span> <br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> send_email_log:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; report<span style="color: black;">&#40;</span>spam<span style="color: #66cc66;">,</span> score<span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>: <br />
&nbsp; &nbsp; db<span style="color: #66cc66;">=</span>init_db<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; msg<span style="color: #66cc66;">=</span>get_msg<span style="color: black;">&#40;</span>db<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; anti_spam<span style="color: black;">&#40;</span>db<span style="color: #66cc66;">,</span> msg<span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">if</span> __name__<span style="color: #66cc66;">==</span><span style="color: #483d8b;">'__main__'</span>:<br />
&nbsp; &nbsp; main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></td></tr></tbody></table></div>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://iregex.org/blog/anti-spam.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>正则凡客</title>
		<link>http://iregex.org/blog/fanke.html</link>
		<comments>http://iregex.org/blog/fanke.html#comments</comments>
		<pubDate>Tue, 10 Aug 2010 12:00:51 +0000</pubDate>
		<dc:creator>rex</dc:creator>
				<category><![CDATA[杂项]]></category>

		<guid isPermaLink="false">http://iregex.org/?p=139</guid>
		<description><![CDATA[按需替换，精准搜索； 有时贪婪，有时懒惰。 喜欢正则，不喜欢回溯； 喜欢用正则解决问题，也知道并非所有问题都能用正则解决。 喜欢在论坛上讨论疑点，也喜欢在博客上分享心得。 自学... ]]></description>
			<content:encoded><![CDATA[<p>按需替换，精准搜索；<br />
有时贪婪，有时懒惰。<br />
喜欢正则，不喜欢回溯；<br />
喜欢用正则解决问题，也知道并非所有问题都能用正则解决。<br />
喜欢在<a href="http://regex.me">论坛</a>上讨论疑点，也喜欢在<a href="http://iregex.org">博客</a>上分享心得。<br />
自学而未成才，不是什么大牛，我是一名正则凡客。 </p>
]]></content:encoded>
			<wfw:commentRss>http://iregex.org/blog/fanke.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>搬家完毕</title>
		<link>http://iregex.org/blog/moved.html</link>
		<comments>http://iregex.org/blog/moved.html#comments</comments>
		<pubDate>Tue, 04 May 2010 01:57:32 +0000</pubDate>
		<dc:creator>rex</dc:creator>
				<category><![CDATA[杂项]]></category>
		<category><![CDATA[host]]></category>
		<category><![CDATA[regexbuddy]]></category>

		<guid isPermaLink="false">http://iregex.org/?p=86</guid>
		<description><![CDATA[原空间(homezz.com)到期, 顺便换为法国alwaysdata.com的了. 搬家很顺利, 使用scp将数据从原空间隔空传物过去; 配置好域名dns, 数据文件, 新空间就激活了. 很顺利. 另, 新站的访问速度如何? 可以接受吗?... ]]></description>
			<content:encoded><![CDATA[<p>原空间(homezz.com)到期, 顺便换为法国alwaysdata.com的了. 搬家很顺利, 使用<a href="http://en.wikipedia.org/wiki/Secure_copy">scp</a>将数据从原空间隔空传物过去; 配置好域名dns, 数据文件, 新空间就激活了. 很顺利.</p>
<p>另, 新站的访问速度如何? 可以接受吗?</p>
<p>目前在蕴酿一篇关于&#8221;如何DIY一款像RegexBuddy那样的正则表达式工具&#8221;的博客, 敬请期待.</p>
]]></content:encoded>
			<wfw:commentRss>http://iregex.org/blog/moved.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>五一搬家</title>
		<link>http://iregex.org/blog/moving.html</link>
		<comments>http://iregex.org/blog/moving.html#comments</comments>
		<pubDate>Thu, 29 Apr 2010 10:53:30 +0000</pubDate>
		<dc:creator>rex</dc:creator>
				<category><![CDATA[杂项]]></category>

		<guid isPermaLink="false">http://iregex.org/?p=85</guid>
		<description><![CDATA[本站在五一期间将更换空间... ]]></description>
			<content:encoded><![CDATA[<p>本站在五一期间将更换空间。</p>
]]></content:encoded>
			<wfw:commentRss>http://iregex.org/blog/moving.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>效率问题</title>
		<link>http://iregex.org/blog/20091022-efficiency.html</link>
		<comments>http://iregex.org/blog/20091022-efficiency.html#comments</comments>
		<pubDate>Thu, 22 Oct 2009 12:13:46 +0000</pubDate>
		<dc:creator>rex</dc:creator>
				<category><![CDATA[杂项]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://iregex.org/?p=70</guid>
		<description><![CDATA[上周发了篇《两条与密码验证相关的正则表达式问题》。今天看了些python的正则表达式，心血来潮，想看看这几种正则哪种效率较高。代码、运行结果见下。这是为什么呢？ 1234567891011121314151617... ]]></description>
			<content:encoded><![CDATA[<p>上周发了篇《<a href="http://iregex.org/blog/2-regex-problems-about-password-verification.html" target="_blank" title="我爱正则表达式|效率问题">两条与密码验证相关的正则表达式问题</a>》。今天看了些python的正则表达式，心血来潮，想看看这几种正则哪种效率较高。代码、运行结果见下。这是为什么呢？</p>
<div class="codecolorer-container python mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br /></div></td><td><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">re</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">fpformat</span><br />
Regex1 <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">re</span>.<span style="color: #008000;">compile</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;^(?=[0-9a-zA-Z@%&amp;]*<span style="color: #000099; font-weight: bold;">\d</span>)(?=[0-9a-zA-Z@%&amp;]*[a-zA-Z])(?=[0-9a-zA-Z@%&amp;]*[@%&amp;])[0-9a-zA-Z@%&amp;]{8,}$&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">re</span>.<span style="color: black;">MULTILINE</span><span style="color: black;">&#41;</span><br />
Regex2 <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">re</span>.<span style="color: #008000;">compile</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;^(?=.*<span style="color: #000099; font-weight: bold;">\d</span>)(?=.*[a-zA-Z])(?=.*[@%&amp;])[0-9a-zA-Z@%&amp;]{8,}$&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">re</span>.<span style="color: black;">MULTILINE</span><span style="color: black;">&#41;</span><br />
Regex3 <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">re</span>.<span style="color: #008000;">compile</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;^(?![0-9a-z]{8,16}$|[@%&amp;]{8,16}$)[a-z0-9@%&amp;]{8,16}$&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">re</span>.<span style="color: black;">IGNORECASE</span> |<span style="color: #dc143c;">re</span>.<span style="color: black;">MULTILINE</span><span style="color: black;">&#41;</span> <br />
<br />
<br />
<br />
TimesToDo <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">1250</span><span style="color: #66cc66;">;</span><br />
TestString <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;&quot;</span><br />
<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">800</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; TestString +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;aba134babdedfg@&amp;%<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
<br />
StartTime <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>TimesToDo<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp;Regex1.<span style="color: black;">search</span><span style="color: black;">&#40;</span>TestString<span style="color: black;">&#41;</span><br />
Seconds <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> - StartTime<br />
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;R1 takes &quot;</span> + <span style="color: #dc143c;">fpformat</span>.<span style="color: black;">fix</span><span style="color: black;">&#40;</span>Seconds<span style="color: #66cc66;">,</span><span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot; seconds&quot;</span><br />
<br />
StartTime <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>TimesToDo<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp;Regex2.<span style="color: black;">search</span><span style="color: black;">&#40;</span>TestString<span style="color: black;">&#41;</span><br />
Seconds <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> - StartTime<br />
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;R2 takes &quot;</span> + <span style="color: #dc143c;">fpformat</span>.<span style="color: black;">fix</span><span style="color: black;">&#40;</span>Seconds<span style="color: #66cc66;">,</span><span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot; seconds&quot;</span><br />
<br />
StartTime <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>TimesToDo<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp;Regex3.<span style="color: black;">search</span><span style="color: black;">&#40;</span>TestString<span style="color: black;">&#41;</span><br />
Seconds <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> - StartTime<br />
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;R3 takes &quot;</span> + <span style="color: #dc143c;">fpformat</span>.<span style="color: black;">fix</span><span style="color: black;">&#40;</span>Seconds<span style="color: #66cc66;">,</span><span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot; seconds&quot;</span></div></td></tr></tbody></table></div>
<p>运行结果：<br />
<a href="http://iregex.org/blog/20091022-efficiency.html" target="_blank"><img src="http://i293.photobucket.com/albums/mm60/zhasm/iregex/20091022.png" border="0" alt="我爱正则表达式|效率问题"></a> </p>
]]></content:encoded>
			<wfw:commentRss>http://iregex.org/blog/20091022-efficiency.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>concise perl re table</title>
		<link>http://iregex.org/blog/concise-perl-re-table.html</link>
		<comments>http://iregex.org/blog/concise-perl-re-table.html#comments</comments>
		<pubDate>Wed, 21 Oct 2009 04:19:41 +0000</pubDate>
		<dc:creator>rex</dc:creator>
				<category><![CDATA[杂项]]></category>

		<guid isPermaLink="false">http://iregex.org/blog/concise-perl-re-table.html</guid>
		<description><![CDATA[GDOC链接在这里... ]]></description>
			<content:encoded><![CDATA[<p>GDOC链接在<a href="http://docs.google.com/View?id=dhbb6gcf_8gqm9brgf" target="_blank" title="我爱正则表达式|简明perl正则参考资料">这里</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://iregex.org/blog/concise-perl-re-table.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>正则学习杂感：磨刀不误砍柴功</title>
		<link>http://iregex.org/blog/20090923-learning-regex.html</link>
		<comments>http://iregex.org/blog/20090923-learning-regex.html#comments</comments>
		<pubDate>Wed, 23 Sep 2009 06:05:39 +0000</pubDate>
		<dc:creator>rex</dc:creator>
				<category><![CDATA[杂项]]></category>
		<category><![CDATA[DFA]]></category>
		<category><![CDATA[NFA]]></category>
		<category><![CDATA[正则式]]></category>
		<category><![CDATA[龙书]]></category>

		<guid isPermaLink="false">http://iregex.org/?p=67</guid>
		<description><![CDATA[反复读紫龙书第三章，以及网文Write Your Own Regular Expression Parser（链接在这篇文章中找），连同该网文附带的源码，终于破关。一点感悟，写在这里。 使用正则表达式搜索字串，比逐位进行strcmp... ]]></description>
			<content:encoded><![CDATA[<p>反复读<a href="http://www.douban.com/subject/1134994/" target="_blank">紫龙书</a>第三章，以及网文Write Your Own Regular Expression Parser（链接在<a href="http://iregex.org/blog/20090918-learning-regex-with-some-urls.html" target="_blank">这篇文章</a>中找），连同该网文附带的源码，终于破关。一点感悟，写在这里。</p>
<p>使用正则表达式搜索字串，比逐位进行strcmp这样的方法要复杂N倍，如果说strcmp是只支持＋－×÷的计算器的话，那么正则表达式就是一台现代化的电脑。正则式不用逐位比较，它有自己的一整套方法。</p>
<p>要想在源字串找某个正则式模式，需要先详尽地分析该正则式，其过程是将该正则式解剖成不可再分的字符（称为状态），然后从任意一个状态开始，通过不同的路径（字符输入）可以到达不同的状态。第一个字符之前，叫做初始状态；最后一个字符之后，叫做接收状态。这种是NFA（不确定的有穷自动机），因为一个状态上有可能存在不止一条的转出状态。</p>
<p>一旦做好了这样的状态集合，就可以进行匹配了。每输入一个字符，从开始状态上就会产生不同的状态集合；依次输入完毕，如果所得到状态集合中包含了一个接受状态，就证明所输入的串是匹配的。但是NFA的效率低下。因为从每个状态上转出的路径不止一条，因此就有回溯。为提升效率，可以将NFA转成等效的DFA，即确定的有穷自动机。</p>
<p>DFA的原理是，对于每个状态集合D和给定的输入字符a，最多只有一条通路可走。与NFA的区别是，对于每个单个的状态f和给定的字符a，就有N条路可走。但是DFA也不是生来就万能的，比方说，它有死状态需要消除，同构的状态需要合并，还存在对于复杂正则表达式的DFA的转换效率低、实现复杂度高的情况，等等。虽如此，NFA转换为DFA还是值得的，有道是磨刀不误砍柴功。</p>
<p>对于正则表达式做好了DFA，就可以进行匹配了。每输入一个字符，自动机就转至下一个状态集合，直至输入结尾。如果所达到的状态集合中包含了接受状态，那么匹配就是成功的。</p>
<p>以上就是NFA、DFA的原理。当然，细节是简化过的。否则的话，上面任何一个步骤都有N多的细节，需要使用各种奇怪的数据结构来存储，复杂的成员函数来操作。</p>
<p>说到这里，想起python, pcre，以及其它一些正则表达式库，都有compile一个选项。先编译再执行，一次编译多次执行，文档一再这样强调。这比一上来就execute效率要高，如果重复执行多次的话。以前总是图方便直接就execute了，现在想想，实现一个正则表达式多不容易呀，对于多次重复的匹配，还是老老实实地compile一次才有礼貌。正则引擎在幕后默默无闻地做了那么多工作，不应该老是麻烦它老人家，呵呵。</p>
]]></content:encoded>
			<wfw:commentRss>http://iregex.org/blog/20090923-learning-regex.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>正则学习杂感，附几枚链接</title>
		<link>http://iregex.org/blog/20090918-learning-regex-with-some-urls.html</link>
		<comments>http://iregex.org/blog/20090918-learning-regex-with-some-urls.html#comments</comments>
		<pubDate>Fri, 18 Sep 2009 02:31:37 +0000</pubDate>
		<dc:creator>rex</dc:creator>
				<category><![CDATA[杂项]]></category>
		<category><![CDATA[DFA]]></category>
		<category><![CDATA[NFA]]></category>
		<category><![CDATA[正则式]]></category>
		<category><![CDATA[龙书]]></category>

		<guid isPermaLink="false">http://iregex.org/?p=65</guid>
		<description><![CDATA[最近在学习编译原理，尤其是正则表达式的实现这一节。从网上搜索到有用的链接，张贴在这里。一个感受是，数学知识是非常有用的，尤其是创造性的编程。如果数学知识足够，完全可以写... ]]></description>
			<content:encoded><![CDATA[<p>最近在学习编译原理，尤其是正则表达式的实现这一节。从网上搜索到有用的链接，张贴在这里。一个感受是，数学知识是非常有用的，尤其是创造性的编程。如果数学知识足够，完全可以写出更加高效的算法；如果数学知识不够，最多只是重复别人已经写好的算法而已。因此在初步学习时，可以不必另造车轮，老老实实地学习已经很成熟的算法，才是正途。</p>
<p>至于正则表达式的实现，其实也只是先有数学思想，然后将其使用编程语言实现而已。准备步骤是先归纳语法树，自顶至下，逐级细分；而实现步骤是从现有的正则表达式自叶至顶，先将正则式转换为NFA图，再优化，转为DFA，这时才可与目标字串进行比较。</p>
<p>在看紫龙书时，感觉到其中从思路到算法，从伪代码到实际代码之间，其转换需要太多的细节来补充。而这些知识，不单来自于对具体语言语法的掌握，还需要合适的数据支持，才能化繁为简，事半功倍。顺便读了一些C++ STL的内容，觉得这些标准库真是相当有用，在构建正则表达式时这些库正好可以物尽其用。STL的作者善莫大焉。</p>
<p>从理论上说，即使没有STL支持的纯C语言，对于实现正则表达式也是没有任何问题的，只不过是自己捎带着再写一遍自己需要的数据结构而已。别说C，就是宏汇编，也可以实现的。如果感兴趣，可以自行到Aogo的www.aogosoft.com上自行搜索他的实现。归结到一句话：思路有了，语言的实现只是翻译。我等初学者是无力想出更高级的实现的，只是在这种翻译过程中，作为一种深化理解和课后练习罢。言归正传，下面是我要推荐的几则链接。</p>
<p>1. 《正则表达式识别》 <a href="http://blog.csdn.net/slavik/archive/2006/09/18/1240386.aspx" target="_blank">http://blog.csdn.net/slavik/archive/2006&#8230;40386.aspx</a> <br />
有图有真相。本文的配图还是挺丰富的。思路也清晰。极具指导意义。<br />
可惜没有源码。该博客的其它相关文章，也值得阅读。</p>
<p>2. 正则表达式 TO NFA表格 <br />
<a href="http://hi.baidu.com/rabbit5455/blog/item/2b2b46f030737bc27931aac8.html" target="_blank">http://hi.baidu.com/rabbit5455/blog/item&#8230;1aac8.html</a><br />
这篇文章主要是提供了源码，源码中附注释。也不错。</p>
<p>3. 《Write Your Own Regular Expression Parser》 <a href="http://www.codeguru.com/cpp/cpp/cpp_mfc/parsing/article.php/c4093" target="_blank">http://www.codeguru.com/cpp/cpp/cpp_mfc/&#8230;.php/c4093</a></p>
<p>本文是英文文章，有图示，有源码，很不错。我正在边阅读，边学习，边翻译，一边自行实现。建议直接阅读英文资料，不必等我的翻译。本文的代码只提供了*,|，以及连接操作的实现。不过也对其它操作的实现给出了指导。我已经在源代码基础上添加了问号和加号的支持。</p>
]]></content:encoded>
			<wfw:commentRss>http://iregex.org/blog/20090918-learning-regex-with-some-urls.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DIY万能通配符</title>
		<link>http://iregex.org/blog/diy-match-all-mode-dot.html</link>
		<comments>http://iregex.org/blog/diy-match-all-mode-dot.html#comments</comments>
		<pubDate>Tue, 11 Aug 2009 08:22:08 +0000</pubDate>
		<dc:creator>rex</dc:creator>
				<category><![CDATA[杂项]]></category>
		<category><![CDATA[dot]]></category>

		<guid isPermaLink="false">http://iregex.org/?p=63</guid>
		<description><![CDATA[指定了点号匹配换行符模式，就可以使用点号来匹配包括换行符在内的任意字符了。不过，JavaScript的正则中无法设置点号通配模式，但是我们可以创造一个可以匹配换行符的点号，如下： 1&#40;... ]]></description>
			<content:encoded><![CDATA[<p>指定了点号匹配换行符模式，就可以使用点号来匹配包括换行符在内的任意字符了。不过，JavaScript的正则中无法设置点号通配模式，但是我们可以创造一个可以匹配换行符的点号，如下：</p>
<div class="codecolorer-container perl mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="perl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&#40;</span><span style="color: #339933;">?:.|</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">\r</span><span style="color: #0000ff;">\n</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span></div></td></tr></tbody></table></div>
<p>除此之外，还可以使用互逆的元字符，来构造这样的万能通配符，例如</p>
<div class="codecolorer-container perl mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="perl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&#91;</span>\<span style="color: #000066;">s</span><span style="color: #0000ff;">\S</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">\d</span><span style="color: #0000ff;">\D</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">\w</span><span style="color: #0000ff;">\W</span><span style="color: #009900;">&#93;</span></div></td></tr></tbody></table></div>
<p>使用普通字符也可以的。因为我们可以将全部字符划分为a和非a，</p>
<div class="codecolorer-container perl mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="perl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&#40;</span><span style="color: #339933;">?:</span>a<span style="color: #339933;">|</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">?!</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #009900;">&#41;</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://iregex.org/blog/diy-match-all-mode-dot.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

