栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在python中找到所有可能的正则表达式匹配项?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在python中找到所有可能的正则表达式匹配项?

实际上,不可能使用正则表达式来做到这一点,因为正则表达式表达了一种由 正则
语法定义的语言,该语言可以通过非限定性自动机来解决,其中匹配由状态表示;然后要匹配嵌套的括号,您需要能够匹配无限数量的括号,然后拥有一个具有无限数量状态的自动机。

为了解决这个问题,我们使用所谓的下推式自动机,用于定义 上下文无关 文法。

因此,如果您的正则表达式与嵌套括号不匹配,那是因为它表示以下自动机,并且与您输入的任何内容都不匹配:

玩吧

作为参考,请查看麻省理工学院有关该主题的课程:

  • http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-045j-automata-computability-and-complexity-spring-2011/lecture-notes/MIT6_045JS11_lec04.pdf
  • http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-005-elements-of-software-construction-fall-2011/lecture-notes/MIT6_005F11_lec05.pdf
  • http://www.saylor.org/site/wp-content/uploads/2012/01/CS304-2.1-MIT.pdf

因此,有效解析字符串的方法之一是为嵌套括号建立语法(

pip install pyparsing
第一个):

>>> import pyparsing>>> strings = pyparsing.Word(pyparsing.alphanums)>>> parens  = pyparsing.nestedExpr( '(', ')', content=strings)>>> parens.parseString('(NP (NNP Hoi) (NN Hallo) (NN Hey) (NNP (NN Ciao) (NN Adios)))').asList()[['NP', ['NNP', 'Hoi'], ['NN', 'Hallo'], ['NN', 'Hey'], ['NNP', ['NN', 'Ciao'], ['NN', 'Adios']]]]

注意:存在一些正则表达式引擎,它们确实使用下推实现嵌套的括号匹配。默认的python

re
引擎不是其中之一,但是存在一个替代引擎,称为
regex
pipinstallregex
),它可以进行递归匹配(这使得re引擎上下文不受约束),请参见以下代码段:

>>> import regex>>> res = regex.search(r'(?<rec>((?:[^()]++|(?&rec))*))', '(NP (NNP Hoi) (NN Hallo) (NN Hey) (NNP (NN Ciao) (NN Adios)))')>>> res.captures('rec')['(NNP Hoi)', '(NN Hallo)', '(NN Hey)', '(NN Ciao)', '(NN Adios)', '(NNP (NN Ciao) (NN Adios))', '(NP (NNP Hoi) (NN Hallo) (NN Hey) (NNP (NN Ciao) (NN Adios)))']


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/624497.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号