zoukankan      html  css  js  c++  java
  • 自然语言处理3.4——使用正则表达式检测词组搭配

    许多语言处理任务都涉及模式匹配。以前我们使用‘stsrtswith(str)’或者‘endswith(str)’来寻找特定的单词。但是下面引入正则表达式,正则表达式是一个强大的模块,他不属于哪一种特定的语言,是一个强大的语言处理工具。

    在Python中使用正则表达式需要使用import re来导入re模块。还需要用于搜索的词汇链表。这里我们再次使用前面使用过的语料库,对它进行预处理消除某些名称。

    >>>import re
    >>>wordlist=[w for w in nltk.corpus.words.words('en') if w.islower()]
    

     1、使用基本的元字符

    使用正则表达式《ed$》查找以ed结尾的词汇。使用函数re.search(p,s)检查字符串s中是否有模式p。使用美元符号,在正则表达式中用来匹配单词的末尾。

    >>>print([w for w in wordlist if re.search('ed$',w)])
    [['abaissed', 'abandoned', 'abased', 'abashed', 'abatised', 'abed', 'aborted', 'abridged', 'abscessed', ...]
    

     通配符‘.’用来匹配任何单个字符。假设有一个8个字符组成的字谜,j是第三个字母,t是第六个字母。

    >>>print([w for w in wordlist if re.search('^..t..t..$',w)])
    ['abjectly', 'adjuster', 'dejected', 'dejectly', 'injector', 'majestic', 'objectee', 'objector', 'rejecter',...]
    

     插入字符‘^’匹配字符串的开始。

    2、范围和闭包

    在手机输入法联想提示,九宫格,输入序列4633可以得到hole和golf,还可以产生哪些字符?使用下面正则表达式进行判断:

    >>>print([w for w in wordlist if re.search('^[ghi][mno][jlk][def]$',w)])
    ['gold', 'golf', 'hold', 'hole']
    

    正则表达式中‘+’号表示‘前面项目的一个或者多个实例’。‘*’表示‘前面的项目的零个或者多个实例’。当‘^’出现在方括号内的第一个字符位置时有其他的功能。例如"[^aeiou]"匹配除元音字母以外的所有字母。

    下面是另外一些正则表达式的例子。使用一些新的符号:|、{}、和|

     >>> wsj = sorted(set(nltk.corpus.treebank.words()))
      >>> [w for w in wsj if re.search('^[0-9]+.[0-9]+$', w)]
      ['0.0085', '0.05', '0.1', '0.16', '0.2', '0.25', '0.28', '0.3', '0.4', '0.5',
      '0.50', '0.54', '0.56', '0.60', '0.7', '0.82', '0.84', '0.9', '0.95', '0.99',
      '1.01', '1.1', '1.125', '1.14', '1.1650', '1.17', '1.18', '1.19', '1.2', ...]
      >>> [w for w in wsj if re.search('^[A-Z]+$$', w)]
      ['C$', 'US$']
      >>> [w for w in wsj if re.search('^[0-9]{4}$', w)]
      ['1614', '1637', '1787', '1901', '1903', '1917', '1925', '1929', '1933', ...]
      >>> [w for w in wsj if re.search('^[0-9]+-[a-z]{3,5}$', w)]
      ['10-day', '10-lap', '10-year', '100-share', '12-point', '12-year', ...]
      >>> [w for w in wsj if re.search('^[a-z]{5,}-[a-z]{2,3}-[a-z]{,6}$', w)]
      ['black-and-white', 'bread-and-butter', 'father-in-law', 'machine-gun-toting',
      'savings-and-loan']
      >>> [w for w in wsj if re.search('(ed|ing)$', w)]
      ['62%-owned', 'Absorbed', 'According', 'Adopting', 'Advanced', 'Advancing', ...]
    

     正则表达式总结如下:

    Table 3-3. Basic regular expression metacharacters, including wildcards, ranges, and closures

    Operator

    Behavior

    .

    通配符,匹配所有字符

    ^abc

    匹配以abc开始的字符串

    abc$

    匹配以abc结尾的字符串

    [abc]

    匹配字符集合

    [A-Z0-9]

    匹配字符范围

    ed|ing|s

    匹配指定的字符串

    *

    前面的项目的零个或多个(Kleene闭包)

    +

    前面的项目的一个或多个

    ?

    前面的项目的一个或零个(可选)

    {n}

    重复n次,n为非负整数

    {n,}

    至少重复n次

    {,n}

    至多重复n次

    {m,n}

    重复多于m次不多于n次

    a(b|c)+

    括号表示操作符的范围

    我们在使用re正则表达式时候要可以使用在字符串加一个前缀‘r’表示一个原始字符串。

  • 相关阅读:
    Leetcode NO.110 Balanced Binary Tree 平衡二叉树
    Leetcode NO.226 Invert Binary Tree 翻转二叉树
    Leetcode NO.215 Kth Largest Element In An Array 数组中的第K个最大元素
    根据特征的浏览器判断
    Cygwin在打开在当前目录
    【转帖】科学对待 健康养猫 打造快乐孕妇
    解决chrome浏览器安装扩展、应用程序一直处在“检查中”的问题
    对【SQL SERVER 分布式事务解决方案】的心得补充
    关于“点击这里继续访问您选择的百度XXX”
    VBA一例:如何保持文本框焦点
  • 原文地址:https://www.cnblogs.com/itdyb/p/5954579.html
Copyright © 2011-2022 走看看