【问题标题】:Python RegEx findall not respondingPython RegEx findall 没有响应
【发布时间】:2020-01-09 17:05:17
【问题描述】:

我只是遇到了一件奇怪的事情。我正在使用Open ANC 作为语料库进行文本抓取的原型设计。

有些文本re 模块没有响应。如果有人可以确认 re 模块可以处理正则表达式的复杂性,我很好。

正则表达式是preceding(?:[^A-Za-z0-9\n\r]*\w+[^A-Za-z0-9\n\r]*)+acquired

出现问题的文字是:

我的主张是,林肯的讲话表达了当时欧洲流行的相同想法。每个具有共同历史和语言的民族构成一个民族,民族生存的自然形态是国家结构。美国人构成一个有机的民族单位的想法含蓄地解释了为什么南方十一个州不能走自己的路。当他担任总统时,林肯仍然在谈论联盟而不是一个国家。但在前几十年的辩论过程中,联合的概念已经获得了国家的形而上学特征。在他的第一次就职演说中,林肯援引了“感情纽带”,甚至在查尔斯顿港的萨姆特堡遭到枪击之前,他就强调了历史斗争的牢不可破的联系:

产生问题的python代码:

import re

txt = "post text here"
regex = r"preceding(?:[^A-Za-z0-9\n\r]*\w+[^A-Za-z0-9\n\r]*)+acquired"
re.findall(regex, txt)

【问题讨论】:

  • 逗号在哪里匹配?
  • [^A-Za-z0-9\n\r]* 是一个否定组,任何既不是字母也不是数字,也不是换行或回车的字符,匹配零次或多次
  • 啊,你说得对,我错过了插入符号,谢谢。

标签: python regex python-3.x


【解决方案1】:

你的模式受到catastrophic backtracking的影响。

这是一个可以与您的输入配合使用的替代模式:

regex = r"preceding[^A-Za-z0-9\n\r]+(?:\w+[^A-Za-z0-9\n\r]+)+?acquired"

这假定必须始终至少有 一个 个非单词字符分隔单词(否则它只会匹配一个长而完整的单词)。

(另见:How can I recognize an evil regex?)

【讨论】:

    猜你喜欢
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2023-01-27
    • 2022-12-18
    相关资源
    最近更新 更多