标签:
一:
正则在Perl、Py森、Ruby、Java等语言中文本的正则表达式几乎是一样的
以前常用到的在网上都有现成的例子拿来用,比如电话格式、邮箱格式之类的。
但是自然语言处理中往往会根据自己的需求来制定一个表达式,如果正则的知识掌握的比较片面,在编写自然语言处理程序时可能会觉得苦恼。
在《自然语言处理简明教程》里面有很系统的正则表达式教程,特意总结出来消化吸收。
二:
最简单的正则表达式就是这样的,由类似于/hello world /的正则来搜索语料库中包含子字符串“hello world”的任何字符串相匹配。/e/是可以匹配到字符串hello的。
[]会匹配其中的某一个字符。比如现在有嫌疑人,我们只知道他的名字可能是下面三种的某一种,分别是张伟、李伟或者黄伟。就可以使用/[张李黄]伟/来在人口数据库中匹配。
正则 |
匹配 |
模式例子 |
/[hH]/ello/
/[abc]/
/[1234567890]/ |
hello or Hello
‘a’或者’b’或者’c’
数字 |
“Hello!”
“happy~”
“1993年” |
用来划定范围,表示某一范围内的任何字符。比如上个例子里面的/[1234567890]/是不是感觉很不方便。如果表示为/[0-9]/就会显得精简的多。
正则 |
匹配 |
模式例子 |
/[A-Z]/
/[a-z]/
/[0-9]/ |
大写字母
小写字母
数字 |
“Hello!”
“happy~”
“1993年” |
如果在方括号之后有脱字符“^”,对应的模式就是否定的。
正则 |
匹配 |
模式例子 |
/[^A-Z]/
/[^aA]/
/[0-9]/ |
非大写字母
既不是a也不是A
数字 |
“Hello!”
“happy~”
“1993年” |
比如我们在语料库中搜索诗人“李白”或者“李太白”,此时方括号就无法帮助我们,因为[]只能表示xx或者XX,但是不能表示有xx或者没xx。此时可以用“?”来表示前一个字符有或者无。
正则 |
匹配 |
/李太?白/
/times?/ |
“李白”或者“李太白”
time或者times |
当正则表达式用来表示重复的字符时,比如在下载文件时,出现了下面的下载进度:
99.9%
99.99%
99.999%
99.9999%
……
此时我们可以用/9*/来表示重复了“0或者若干次”的字符“9”,因此想表示出现了一次或者多次的“9”,需要用/99*/。
因此/99\.99*%/可以用来表示上述进度条。(此处的“.”需要转译,因为我们不想让他表示为通配符)
稍微复杂点:
/[10]*/可以用来表示一个二进制串,比如“1010100001110001”
但是我用/99*/来表示重复了“0或者若干次”的字符“9”时总觉得多写了一个“9”很不爽,这时有没有办法帮我们省掉多打一个“9”的时间呢?
/9+/就可以了~
因此使用/[10]+/来搜索语料中的二进制字符串看起来更顺手
哎那个马什么民,帮我把袜子洗一下。
这样说话是很不礼貌的,但是当我们确实忘了别人名字时怎么办呢?
正则表达式同样可以解决这个问题。
正则里面有一个点号,通配符(/./)可以表示任何字符。
/马.民/可以在你的班级花名册里面搜索到所有叫“马X民”的人。
正则 |
匹配 |
模式例子 |
/[beg.n]/
|
beg和n中包含一个字符的字符串 |
begin,beg‘n,begun |
当/./和/*/或者/+/碰到时,什么神奇的事情会发生呢?
比如我们想知道有一天 马X民对黄伟做了什么事情,怎么写正则来在班级日志里面缩小搜索范围呢?
/马.民.+黄伟/就可以表示在一个长字符串里面,符合马X民bulabula黄伟的句子。
标签:
原文地址:http://www.cnblogs.com/kuqs/p/5727409.html