我想从一个句子中提取一个人的年龄;这有点简化,但这都是为了一个研究项目。我知道在句子中,年龄总是在冒号前跟 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/