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’表示一个原始字符串。

  • 相关阅读:
    Linux命令详解之—tail命令
    Linux命令详解之—less命令
    Linux命令详解之—more命令
    Linux命令详解之—cat命令
    Linux命令详解之—pwd命令
    Linux命令详解之–cd命令
    ubuntu-14.04安装最新tensorflow记录
    rn最新版测试
    boost asio死锁一例
    dskinlite自适应dpi
  • 原文地址:https://www.cnblogs.com/itdyb/p/5954579.html
Copyright © 2011-2022 走看看