当你遇见了一个问题需要使用正则来处理,这个时候你就有了两个问题。
我主业是做图像处理,自然语言处理接触不多,正则表达式的研究并不深入,本文只讲述一些小技巧,如果你对正则表达式比较感兴趣,可以去看看有本书好像叫《Python 核心编程》。本文涉及的内容有两方面:你想要根据不止一个字符来分隔字符串;你想要把字符串中几种不同字符过滤掉或者替换成某种特定字符(串)。
本文给出了一个例子,我从《资治通鉴》中摘了一段话,想要提取其中的文字,过滤掉其中的标点符号。
import retext = "趙王封樂毅於觀津,尊寵之,以警動於燕、齊。燕惠王乃使人讓樂毅," \ "且謝之曰:「將軍過聽,以與寡人有隙,遂捐燕歸趙。將軍自為計則可矣," \ "而亦何以報先王這所以遇將軍之意乎?」樂毅報書曰:「昔伍子胥說聽" \ "於闔閭而吳遠跡至郢;夫差弗是也,賜之鴟夷而浮之江。吳王不寤先論" \ "之可以立功,故沈子胥而不悔;子胥不蚤見主之不同量,是以至於入江" \ "而不化。夫免自立功以明先王之跡,臣之上計也。離毀辱之誹謗,墮先王之名," \ "臣之所大恐也。臨不測之罪,以幸為利,義之所不敢出也。臣聞古之君子," \ "交絕不出惡聲,忠臣去國,不潔其名。臣雖不佞,數奉教於君子矣。" \ "唯君王之留意焉!」於是燕王復以樂毅子閒為昌國君,而樂毅往來復通燕," \ "卒於趙,號曰望諸君。"
此处我定义了一些中文标点符号,但是还没穷举所有的符号,如果你遇见了其他的需要自行加进去。这里是将中文符号替换成空格,如果只需要过滤掉的话,re.sub函数第二个参数改成一个空字符串就行了,非常的人性化。
此处是过滤掉多数非汉字内容,使用了unicode范围来确定是不是汉字,这里的范围并不只包含中国人使用的汉字,这个范围大概覆盖了CJK Unified Ideographs(中日韩统一表意文字列表),其中包含了中国、韩国、日本使用的多数常用汉字,可能还有越南使用的汉字。我这段《资治通鉴》是Traditional Chinese,对应的文字编码也涵盖在内。值得注意的是,这里的范围并不包含所有的汉字,一些偏难怪字并不在此范围内。如果你说想要过滤emoji、偏旁部首、注音符号之类的可以去检索一下对应的unicode范围。
这两行以标点符号将文本分割成小句,上面结果中包含了标点符号,下面结果不带。
我写出来的代码比较难懂,这里展示给你看的经过了我的简化只包含了正则本身相关的内容。总结起来说,正则表达式是你处理字符串的最终方案,相当强大,但是同样复杂,一般场景下只需要使用字符串自带的方法即可,比如字符串自带方法可以按照一种字符分割字符串,也可以将一种字符替换成另一种。