正则表达式的中文搜索
2014-09-16 19:51
239 查看
这几天在研究爬虫,想在抓回来的文本中找出中文来,就捎带着研究了一下正则。没想到一如侯门深似海。
关于正则,有个很出名的笑话:有个程序员遇到了问题,他决定要用正则表达式去解决。现在他有了两个问题。(实用正则的时候肯定会有问题,而原来的问题依然还在)
还有这样一个笑话:给一个程序员正则表达式,他会拿着去匹配出字符;教给他如何实用正则表达式,你会得到一个浑身是问题的人。
(原谅我这生硬的翻译。)
通过so.com查询关键字,会得到一个utf-8 编码的字符串,当查询科技的时候:
我们想要的是后面那个字典。但是直接转换,或者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]+)\""
代码是这个样子的:
PS:其实没有必要写这篇文章的,但是实在是太郁闷了。等我抽出身了,一定要好好研究正则表达式。
————————————
github主页:https://github.com/gt11799
E-mail:gting405@163.com
关于正则,有个很出名的笑话:有个程序员遇到了问题,他决定要用正则表达式去解决。现在他有了两个问题。(实用正则的时候肯定会有问题,而原来的问题依然还在)
还有这样一个笑话:给一个程序员正则表达式,他会拿着去匹配出字符;教给他如何实用正则表达式,你会得到一个浑身是问题的人。
(原谅我这生硬的翻译。)
通过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":"科技皇朝","obdata":"{\"mt\":\"novel_free\",\"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
相关文章推荐
- vs2010搜索中文的正则表达式
- python学习系列(六)--- 正则表达式搜索中文
- android studio 全局搜索中文字符 正则表达式
- (转)C#中利用正则表达式实现字符串搜索
- [hwl]限制只能输入中文或英文姓名的正则表达式
- C#中利用正则表达式实现字符串搜索
- 利用正则表达式计算含有中文的字符串长度
- 有关中文的正则表达式
- C#中利用正则表达式实现字符串搜索
- C#利用正则表达式实现字符串搜索
- C#中利用正则表达式实现字符串搜索
- UltraEdit正则表达式搜索替换小技巧
- 如何用正则表达式来表示中文?
- C#利用正则表达式实现字符串搜索
- 判断字符串中有多少中文字符*java正则表达式使用
- 正则表达式判断中文字符
- 有关中文的正则表达式
- 用正则表达式处理含中文字符串的问题
- 中文字符的正则表达式
- 用正则表达式来表示中文