python - 正则表达式以匹配以文本格式编写的年龄

标签 python regex

我想从一个句子中提取一个人的年龄;这有点简化,但这都是为了一个研究项目。我知道在句子中,年龄总是在冒号前跟 0 个或多个空格,或者冒号、空格、几个单词和一些空格(例如:“角色:一位可爱的八十岁的奶奶”,我想要一个允许我从其中一个组中提取“80”的正则表达式)。我正在使用 python 的“re”库,我的代码卡在这个例子上(下面的代码和例子):

regex_age_string = r'([:]*[ ]*)?((([a-z]*)([ -]*))+)([ -]+)(year)'
regex_age_string = re.compile(regex_age_string, re.DOTALL)
sentence = 'history:   four year-old boy was really sad when he found 
out the toy was broken'
age_extract_string = re.search(regex_age_string, sentence)
print(age_extract_string.group())
print(age_extract_string.group(2))

但是,当我通过删除一些尾词来缩短句子时,效果会很好。我阅读了有关由于灾难性回溯而挂起的正则表达式搜索的信息,但我不确定这在此处如何应用/如何修复它。

最佳答案

您的正则表达式导致减速的原因是 catastrophic backtracking .它是由量化组内的一系列可选模式引起的 - (([a-z]*)([ -]*))+

您实际上可以匹配从 :year:

的任何字母、空格或连字符
r':\s*([a-z\s-]*?)\s*-*year'

参见 regex demo .

详情

  • : - 一个 :
  • \s* - 0+ 个空格
  • ([a-z\s-]*?) - 第 1 组:0+ 个小写 ASCII 字母、空格或连字符
  • \s* - 0+ 个空格
  • -* - 0+ - 个字符
  • year - 一个子字符串。

关于python - 正则表达式以匹配以文本格式编写的年龄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50129589/

相关文章:

javascript - 正则表达式计数下划线

python - 在python中生成两个项目的所有可能长度n的组合

android - 如何在 TextWatcher 中验证 URL 同时匹配空字符串

regex - Lua gsub - 如何在正则表达式模式中设置最大字符限制

java - 在 Java 中使用正则表达式解析城市坐标

regex - 如果文本只包含一次字符串,则匹配该文本的正则表达式

python - 如何使用 ECDSA secp256k1 曲线在 python 中以与在 Javascript 中签名相同的方式对消息进行签名?

python:psycopg2:psql:删除条件所在的行

带循环的 Python doctest

python - 如何制作一个连接到 sqlite3 数据库的可执行 python tkinter 文件