You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用正则表达式捕获特定关键词后括号中的数字10?

解决正则匹配问题:捕获数字10及后续3-4个单词

首先,咱们来拆解你遇到的问题,一步步找到解决方案:

为什么第二个正则返回空数组?

你的第二个正则是:

re.compile(r'interest at the rate of\s+((?:\w+(?:\s+|$)){3})')

这里的\w+只能匹配字母、数字和下划线,但目标字符串里of后面的第三个内容单元是(10%)——括号()和百分号%都不在\w的匹配范围内,导致{3}的循环没法完成匹配,最终返回空数组。


方案1:精准捕获数字10

如果你的核心需求是提取括号里的数字10,可以直接定位到括号位置,用正则精准捕获:

import re

text = "interest at the rate of ten percent (10%)"
pattern = re.compile(r'interest at the rate of\s+\w+\s+\w+\((\d+)\%)')
result = pattern.findall(text)
print(result)  # 输出: ['10']

这个正则的逻辑很清晰:

  • 先匹配固定前缀interest at the rate of
  • 接着匹配前面两个单词(tenpercent):\s+\w+\s+\w+
  • 最后捕获括号里的数字:\((\d+)\%),其中\(\)是转义后的括号,(\d+)专门捕获1个或多个数字。

方案2:捕获后续3-4个「内容单元」(含符号)

如果需要捕获of后面的3-4个内容单元(包括带括号和百分号的(10%)),可以把匹配「单元」的规则从\w+放宽为[\w()%]+,这样就能包含括号、百分号这类特殊符号:

import re

text = "interest at the rate of ten percent (10%)"
# 捕获3个完整单元
pattern_3 = re.compile(r'interest at the rate of\s+((?:[\w()%]+(?:\s+|$)){3})')
result_3 = pattern_3.findall(text)
print(result_3)  # 输出: ['ten percent (10%)']

# 同时捕获前置单词和数字(多捕获组)
pattern_multi = re.compile(r'interest at the rate of\s+((?:\w+\s+){2})\((\d+)\%)')
result_multi = pattern_multi.findall(text)
print(result_multi)  # 输出: [('ten percent ', '10')]

这里的[\w()%]+表示匹配包含字母、数字、下划线、括号、百分号的连续字符,让(10%)能被识别为一个完整单元。


灵活适配方案(应对格式变动)

如果不确定后续内容的格式,还可以用非贪婪匹配.*?来匹配到括号前的内容,避免过度匹配:

pattern_flex = re.compile(r'interest at the rate of\s+(.*?)\((\d+)\%)')
result_flex = pattern_flex.findall(text)
print(result_flex)  # 输出: [('ten percent ', '10')]

这个写法更灵活,即使of后面的单词数量有小变动,也能准确捕获到数字和前置内容。

内容的提问来源于stack exchange,提问作者dhinar1991

火山引擎 最新活动