一:

正则在Perl、Py森、Ruby、Java等语言中文本的正则表达式几乎是一样的

以前常用到的在网上都有现成的例子拿来用,比如电话格式、邮箱格式之类的。

但是自然语言处理中往往会根据自己的需求来制定一个表达式,如果正则的知识掌握的比较片面,在编写自然语言处理程序时可能会觉得苦恼。

在《自然语言处理简明教程》里面有很系统的正则表达式教程,特意总结出来消化吸收。

二:

  • 双斜线“//”

    最简单的正则表达式就是这样的,由类似于/hello world /的正则来搜索语料库中包含子字符串“hello world”的任何字符串相匹配。/e/是可以匹配到字符串hello的。

  • 中括号“[]”

    []会匹配其中的某一个字符。比如现在有嫌疑人,我们只知道他的名字可能是下面三种的某一种,分别是张伟、李伟或者黄伟。就可以使用/[张李黄]伟/来在人口数据库中匹配。

正则

匹配

模式例子

/[hH]/ello/

/[abc]/

/[1234567890]/

hello or Hello

‘a’或者’b’或者’c’

数字

“Hello!”

“happy~”

“1993年”

  • {}表示限制长度。如:.{1}表示匹配一个任意字符
  • 连字符“-”

    用来划定范围,表示某一范围内的任何字符。比如上个例子里面的/[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

  • “Kleene*”

    当正则表达式用来表示重复的字符时,比如在下载文件时,出现了下面的下载进度:

99.9%

99.99%

99.999%

99.9999%

……

此时我们可以用/9*/来表示重复了“0或者若干次”的字符“9”,因此想表示出现了一次或者多次的“9”,需要用/99*/。

因此/99\.99*%/可以用来表示上述进度条。(此处的“.”需要转译,因为我们不想让他表示为通配符)

稍微复杂点:

/[10]*/可以用来表示一个二进制串,比如“1010100001110001”

  • “Kleene+”

但是我用/99*/来表示重复了“0或者若干次”的字符“9”时总觉得多写了一个“9”很不爽,这时有没有办法帮我们省掉多打一个“9”的时间呢?

/9+/就可以了~

因此使用/[10]+/来搜索语料中的二进制字符串看起来更顺手

  • 通配符“.”

哎那个马什么民,帮我把袜子洗一下。

这样说话是很不礼貌的,但是当我们确实忘了别人名字时怎么办呢?

正则表达式同样可以解决这个问题。

正则里面有一个点号,通配符(/./)可以表示任何字符。

/马.民/可以在你的班级花名册里面搜索到所有叫“马X民”的人。

正则

匹配

模式例子

/[beg.n]/

beg和n中包含一个字符的字符串

begin,beg‘n,begun

当/./和/*/或者/+/碰到时,什么神奇的事情会发生呢?

比如我们想知道有一天 马X民对黄伟做了什么事情,怎么写正则来在班级日志里面缩小搜索范围呢?

/马.民.+黄伟/就可以表示在一个长字符串里面,符合马X民bulabula黄伟的句子。

  • 锚号“^”和“$”

顾名思义,锚号是用来把正则“锚”在字符串的特定位置的。最普通的锚号是“^”和“$”,当“^”用作锚号的时候,表示一行的开始。比如/^The/就表示单词The必须出现在一句话的开头。相反“$”表示一行的结尾。

回到上面的例子,比如我们想在班级日志里面找到“马兴民xxx黄伟。”这样的句子,就可以使用锚号来定位。/^马兴民.+黄伟。$/

  • 词界“\b”“\B”

  

\b表示词界,\B表示非词界。

首先,在计算机语言里面,什么是一个词呢。从技术上说,词被定义为数字、下划线、或者字母的任何序列。

比如我们在搜索单词“a”的时候,如果仅仅用/a/,同样会匹配到类似于“happy”这样的单词,但是如果用/\ba\b/的话,就会只找到单词a。比如“I am a handsome man.”

它仅仅会匹配到单词“a”而非“am”。

  • 析取符“|”

析取符表示或者。

前面有个小伙子很眼熟,我记得他的名字叫马兴民或者黄伟。现在我打开在线班级花名册,输入正则/黄伟|马兴民/,一下就找到了两个人的信息和照片,一看哦都不是。

析取符就是用来表示或者,/a|b/表示a或者b。

在英文语料中,有时候会出现名词的复数形式比如cat和cats,这种形式我们很容易表达。但是有些复数比如family的复数families该如何表达呢。

首先famil串已经是固定的了,这时我们只需要尾串跟上y或者ies即可,此时我们使用圆括号运算符(),将一个模式括起来,使得它就像一个单独的字符。因此如果我们想找到语料中的family和families时,需要用/famil(y|ies)/,析取符仅仅运用于后缀y或者ies。

三:

  • 通用字符集的替换

  

正则

扩充表达式

匹配

\d

\D

\w

\W

\s

\S

[0-9]

[^0-9]

[a-zA-Z0-9]

[^\w]

[_\r\t\n\f]

[^\s]

数字字符

非数字字符

数字字母下划线

相反

表格,换行等空白区域

非空白区域

  • 计数符

正则

匹配

*

+

?

{n}

{n,m}

{n,}

零或多

一或多

零或一

出现n次

n到m次

至少n次

  • ? 贪婪模式与非贪婪模式

    比如在HTML中有许多标签<div>part1</div><div>part2</div><div>part3</div><div>part4</div>

    使用<div>.*</div>匹配到的是:<div>part1</div><div>part2</div><div>part3</div><div>part4</div>,此时为贪婪模式。

    使用<div>.*?</div>匹配到的是:<div>part1</div>

  • (?<=exp) (?=exp)零宽断言

    (?<=exp) 表示匹配exp之后的,(?=exp)表示匹配exp之前的。

    比如上面标签例子:<div>part1</div><div>part2</div><div>part3</div><div>part4</div>

    如果我们仅仅想拿到标签里面的内容,就可以使用零宽断言:

    (?<=<div>).*(?=</div>)此时匹配到:part1</div><div>part2</div><div>part3</div><div>part4

    结合上面的零宽断言:

    (?<=<div>).*(?=</div>)此时匹配到:part1 part2 part3 part4

    

  • 一个开发思路的例子

    当我们想在语料中查找英语冠词the的时候,随手写下正则/the/。

    但是随后发现有些地方是不完善的,比如当the出现在开头的时候,就是The,因此我们把正则改成/[tT]he/。

    此时这个正则还是不完善的,因为它会找到诸如There,other这样的单词,因此我们给它加上了词界/\b[tT]he\b/。

    问题又来了,假如我们不想把下划线和数字作为词界,我们还希望能够找到形如 _the,the99这样的词。此时我们需要给the的两段加上限制:不能为字母。于是正则变成了/[^a-zA-Z][tT]he[^a-zA-Z]/。

    万事大吉了吗?这时候我们发现,当the出现在开头的时候,正则找不到它,因为我们规定了the的开头必须有一个非英文字符,因此我们需要修改开头为,the出现在开头或者开头有一个非英文字符。即/(^|[^a-zA-Z])[tT]he[^a-zA-Z]/。

    终于到这里,一个符合要求的简单的定冠词the被搜索了出来。

    平时书写正则的时候也要注意,提升准确率,提升覆盖率。

转载地址:https://www.cnblogs.com/kuqs/p/5727409.html

正则表达式中常用符号相关推荐

  1. 18、正则表达式中常用字符

    1.基本规则 锚点----标识位置 ^: 表示句首.   $: 表示句尾. \<: 表示詞首.  \>: 表示詞尾. 修饰符 *: 表示前一個 char. set 的出現次數為 0 或多次 ...

  2. c语言中常用符号,C语言中常用的符号.doc

    1.按位与运算 ①概念 "按位与"运算符"&"是双目运算符,其功能是将参与运算两数的各对应二进位相与.只能对应的两个二进位均为1时,结果位才为1,否则为 ...

  3. 记录一些密码学中常用符号

    符号 意义 p,qp,qp,q 大素数 ZpZ_{p}Zp​ 0,1,2,-,p-1 Zp∗Z_{p}^{*}Zp∗​ 1,2,3,-,p-1 {0,1}n\{0,1\}^{n}{0,1}n 长度为n ...

  4. Latex中数学公式中常用符号(持续更新)

    集合关系符号 代码 符号 代码 符号 \forall ∀\forall∀ \exist ∃\exist∃ +\infty +∞+\infty+∞ -\infty −∞-\infty−∞ \varnot ...

  5. 数学中常用符号及希腊字母的念法

    阅读原文点我  (仅供学习交流使用) 链接2 + : plus(positive正的) -:minus(negative负的) *:multiplied by ÷:divided by =: be e ...

  6. 正则表达式中原子的5种类型

    原子是正则表达式的最基本的组成单位,而且在每个模式中最少包含一个原子.原子是由所有那些未显示指定为元字符的打印和非打印字符组成,所以在这里将其详细划分为五类进行介绍. ①普通字符作为原子 普通字符是编 ...

  7. 正则表达式中(RegExp)的字符和转译

    正则表达式中常用的特殊字符: 符号 含义 ^ 匹配的起始位置,^在 [ ] 中表示反义 $ 匹配的结束位置 . 可以任意匹配任意一个字符 ,[ ] 中的 . 是字符 . ? 匹配前面的字符0次或一次, ...

  8. 正则表达式中模式修正符作用详解(i、g、m、s、x、e)

    正则表达式中常用的模式修正符有i.g.m.s.x.e等.它们之间可以组合搭配使用. 它们的作用如下: //修正符:i 不区分大小写的匹配; //如:"/abc/i"可以与abc或a ...

  9. 前端开发中的 正则表达式 及常用正则表达式大全

    RegExp 是正则表达式(Regular expression)的缩写,就是用一个"字符串"来描述一个特征,然后去验证另一个"字符串"是否符合这个特征.比如 ...

  10. 工作中常用的正则表达式

    正则表达式中的常用符号 ^ 匹配输入字符串的开始位置. $ 匹配输入字符串的结束位置. * 匹配前面的子表达式零次或多次. \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个后向引用.或一个八 ...

最新文章

  1. 怎样设置html的元素属性,Jquery怎么设置元素的属性和样式?
  2. pythonweb开发-5个最好的Python Web开发框架
  3. Linux定时任务Crontab学习笔记
  4. MySQL的自然联结+外部联结(左外连接,右外连接)+内部联结
  5. [HNOI2016]网络 树链剖分,堆
  6. tablueau地图标记圆形_高德地图实现自定义小蓝点 自定义点标记 绘制多边形/圆形区域 根据地图的移动显示或者隐藏自定义点标记的相关实现...
  7. 线程5-生产者消费者模式(线程通信)
  8. Transformers与图神经网络的关系,我们能从transformer学习到什么?
  9. docker选择安装路径_Docker安装
  10. 我辞掉程序员的工作,体验了半年的自驾游生活
  11. Clojure 学习入门(13)- binding
  12. JQuery window、document、 body
  13. 程序员常去的14个顶级开发社区
  14. ubuntu安装pgadmin4
  15. 数据库课程设计基本框架(PHP+MySQL)
  16. MBA案例分析(行销与营销之营销六)
  17. java计算机毕业设计在线作业管理系统源码+mysql数据库+系统+lw文档+部署
  18. Hexo博客配置优化
  19. 栈(Stack)和队列(Queue)详解
  20. MacBook安装WTG不详细的教程(含泪踩坑)

热门文章

  1. 适合学计算机用的机械键盘,一款好用的机械键盘应该怎么选?看完这篇就明白了...
  2. Java程序员应该学习的10大技术
  3. 社会工程学攻击案例-网站钓鱼
  4. 一句话告诉您什么是运维?以及如何运维才能事半功倍?
  5. IE 提示 当前安全设置不允许下载该文件
  6. 抖音 iOS 推荐 Feed 容器化总结
  7. 长安清酒·花酿清酒一瓣心醉的甜香
  8. Temporal Abstraction
  9. php火车票查询,基于php的12306火车票查询接口调用代码实例
  10. 在BAT工作是什么样的?来听听在职员工们的说法