正则表达式的中文搜索

这几天在研究爬虫,想在抓回来的文本中找出中文来,就捎带着研究了一下正则。没想到一如侯门深似海。

关于正则,有个很出名的笑话:有个程序员遇到了问题,他决定要用正则表达式去解决。现在他有了两个问题。(实用正则的时候肯定会有问题,而原来的问题依然还在)

还有这样一个笑话:给一个程序员正则表达式,他会拿着去匹配出字符;教给他如何实用正则表达式,你会得到一个浑身是问题的人。

(原谅我这生硬的翻译。)

通过so.com查询关键字,会得到一个utf-8 编码的字符串,当查询科技的时候:

 suggest_so({"query":"科技","result":[{"word":"科技美学"},{"word":"科技苑"},{"word":"科技小制作大全"},{"word":"科技管理研究"},{"word":"科技网"},{"word":"科技少女喵","obdata":"{\"t\":\"video\"}"},{"word":"科技部"},{"word":"科技日报"},{"word":"科技超能王","obdata":"{\"mt\":\"novel_free\",\"md\":[\"http:\/\/p3.qhimg.com\/dr\/80_100_100\/t0155de86b15e45143c.jpg\",\"\u79d1\u6280\u8d85\u80fd\u738b\",\"\u516c\u5143\u524d\u7684\u72d0\",\"http:\/\/m.leidian.com\/ebook\/detail\/152564325945203970?src=m_so\"]}"},{"word":"科技皇朝",\"md\":[\"\",\"\u79d1\u6280\u7687\u671d\",\"\u7b14\u6307\u6c5f\u5c71\",\"http:\/\/m.leidian.com\/ebook\/detail\/11001634457921487175?src=m_so\"]}"}],"version":"2.10"});
我们想要的是后面那个字典。但是直接转换,或者split之类的基本都不行。这样就要拿出正则表达式来匹配了。

很显然,我们想要的是每个“ ”中间的中文。我去网上查中文的匹配,发现每篇文章都一样,只是提了中文的utf-8的范围:

unicode中中文的编码为\u4e00-\u9fa5

最让我失望的是,谷歌的第一页的中文文章几乎都一模一样。

于是我就直接去匹配中文,正则表达式如下:

"\"[\u4e00-\u9fa5]+\""

解释一下,外面的引号代表这是个字符串,里面的\"是转义的",因为“在字符串中有其他定义,想要搜索”就要加\使其保持原来的意义。

中括号内\u指的是unicode,4e00-9fa5则是中文的范围。中括号内的意思就是这个范围内的任何一个。

后面的+指的是前面那个表达式的一个或多个,也就是中括号内的一个或多个。

结果我得到的是一堆“:”的重复。我百思不得其解,怀疑是编码的问题。把上面那个字符串命名为html

html_code = html.decode('utf8')

再搜索,发现只搜出了空集。

*****经过了很久很久******

后来发现字符串也需要标注是unicode

u"\"[\u4e00-\u9fa5]+\""

嗯,就这样解决了。不过搜索出来的还是结果带着“”,我只想要其中的关键字。就把想要取出的词加上小括号即可。

u"\"([\u4e00-\u9fa5]+)\""

代码是这个样子的:

html_code = html.decode('utf8')
    pattern = re.compile(u"\"([\u4e00-\u9fa5]+)\"")
    results = pattern.findall(html_code)
    for result in results:
        print "%s" %result
结果是:

科技
科技美学
科技苑
科技小制作大全
科技管理研究
科技网
科技少女喵
科技部
科技日报
科技超能王
科技皇朝


PS:其实没有必要写这篇文章的,但是实在是太郁闷了。等我抽出身了,一定要好好研究正则表达式。
————————————

github主页:https://github.com/gt11799

E-mail:gting405@163.com

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


jquery.validate使用攻略(表单校验) 目录 jquery.validate使用攻略1 第一章 jquery.validate使用攻略1 第二章 jQuery.validate.js API7 Custom selectors7 Utilities8 Validato
/\s+/g和/\s/g的区别 正则表达式/\s+/g和/\s/g,目的均是找出目标字符串中的所有空白字符,但两者到底有什么区别呢? 我们先来看下面一个例子: let name = 'ye wen jun';let ans = name.replace(/\s/g, '&#3
自整理几个jquery.Validate验证正则: 1. 只能输入数字和字母 /^[0-9a-zA-Z]*$/g jQuery.validator.addMethod("letters", function (value, element) { return this.optio
this.optional(element)的用法 this.optional(element)是jquery.validator.js表单验证框架中的一个函数,用于表单控件的值不为空时才触发验证。 简单来说,就是当表单控件值为空的时候不会进行表单校验,此函数会返回true,表示校验通过,当表单控件
jQuery.validate 表单动态验证 实际上jQuery.validate提供了动态校验的方法。而动态拼JSON串的方式是不支持动态校验的。牺牲jQuery.validate的性能优化可以实现(jQuery.validate的性能优化见图1.2 jQuery.validate源码 )。 也可
自定义验证之这能输入数字(包括小数 负数 ) <script type="text/javascript"> function onlyNumber(obj){ //得到第一个字符是否为负号 var t = obj.value.charAt(0); //先把非数字的都
// 引入了外部的验证规则 import { validateAccountNumber } from "@/utils/validate"; validator.js /*是否合法IP地址*/ export function validateIP(rule, value,cal
VUE开发--表单验证(六十三) 一、常用验证方式 vue 中表单字段验证的写法和方式有多种,常用的验证方式有3种: data 中验证 表单内容: <!-- 表单 --> <el-form ref="rulesForm" :rules="formRul
正则表达式 座机的: 例子: 座机有效写法: 0316-8418331 (010)-67433539 (010)67433539 010-67433539 (0316)-8418331 (0316)8418331 正则表达式写法 0\d{2,3}-\d{7,8}|\(?0\d{2,3}[)-]?\d
var reg = /^0\.[1-9]{0,2}$/;var linka = 0.1;console.log (reg.test (linka)); 0到1两位小数正则 ^(0\.(0[1-9]|[1-9]{1,2}|[1-9]0)$)|^1$ 不含0、0.0、0.00 // 验证是否是[1-10
input最大长度限制问题 <input type="text" maxlength="5" /> //可以 <input type="number" maxlength="5" /> //没有效
js输入验证是否为空、是否为null、是否都是空格 目录 1.截头去尾 trim 2.截头去尾 会去掉开始和结束的空格,类似于trim 3.会去掉所有的空格,包括开始,结束,中间 1.截头去尾 trim str=str.trim(); // 强烈推荐 最常用、最实用 or $.trim(str);
正则表达式语法大全 字符串.match(正则):返回符合的字符串,若不满足返回null 字符串.search(正则):返回搜索到的位置,若非一个字符,则返回第一个字母的下标,若不匹配则返回-1 字符串.replace(正则,新的字符串):找到符合正则的内容并替换 正则.test(字符串):在字符串中
正整数正则表达式正数的正则表达式(包括0,小数保留两位): ^((0{1}.\d{1,2})|([1-9]\d.{1}\d{1,2})|([1-9]+\d)|0)$正数的正则表达式(不包括0,小数保留两位): ^((0{1}.\d{1,2})|([1-9]\d.{1}\d{1,2})|([1-9]+
JS 正则验证 test() /*用途:检查输入手机号码是否正确输入:s:字符串返回:如果通过验证返回true,否则返回false /function checkMobile(s){var regu =/[1][3][0-9]{9}$/;var re = new RegExp(regu);if (r
请输入保留两位小数的销售价的正则: /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/ 1.只能输入英文 <input type="text" onkeyup="value
判断价格的正则表达式 价格的正则表达式 /(^[1-9]\d*(\.\d{1,2})?$)|(^0(\.\d{1,2})?$)/; 1 解析:价格符合两种格式 ^ [1-9]\d*(.\d{1,2})?$ : 1-9 开头,后跟是 0-9,可以跟小数点,但小数点后要带上 1-2 位小数,类似 2,2
文章浏览阅读106次。这篇文章主要介绍了最实用的正则表达式整理,比如校验邮箱的正则,号码相关,数字相关等等,本文给大家列举的比较多,需要的朋友可以参考下。_/^(?:[1-9]d*)$/ 手机号
文章浏览阅读1.2k次。4、匹配中的==、an==、== an9、i9 == "9i"和99p==请注意下面这部分的作用,它在匹配中间内容的时候排除了说明:当html字符串如下时,可以匹配到两处,表示匹配的字符串不包含and且不包含空白字符。说明:在上面的正则表达式中,_gvim正则表达式匹配不包含某个字符串
文章浏览阅读897次。【代码】正则表达式匹配a标签的href。_auto.js 正则匹配herf