4

我正在将 Python 与re模块一起使用,并尝试使用以下正则表达式匹配像decimal(4,1)and之类的字符串decimal(10,5),而实际上只返回4,1and 10,5

(?<=decimal\()\d+,\d+(?=\)$)

假设我用它编译正则表达式re.compile并命名它DECIMAL。如果我尝试decimal(4,1)像这样搜索正则表达式的实例:

DECIMAL = re.compile(r'(?<=decimal\()\d+,\d+(?=\)$)')
results = DECIMAL.search('decimal(4,1)')

results.group(0)根据需要返回字符串4,1。但是,如果我尝试匹配而不是搜索:

results = DECIMAL.match('decimal(4,1)')

results评估为None

该方法是否在match这里失败,因为match看起来将正则表达式的消耗部分与大海捞针的开头完全匹配,因此没有任何空间来确认前面的正长度模式?

至于立即实用,在这种情况下,简单的搜索是行不通的,因为DECIMAL会出现不可接受的字符串,如snarfdecimal(4,1). 我应该在某处放入字符串开头的标记,还是我完全遗漏了其他东西?

4

2 回答 2

2

与 不同search()的是,Python 的match()方法自动将匹配锚定在字符串的开头。这意味着您试图在字符串开头decimal( 之前匹配文字字符串,这当然总是会失败。

正如 Jared 指出的那样,无论如何您都不需要为此进行回顾。事实上,lookbehind 应该是您使用的最后一个工具,而不是第一个。

这是 Jared 正则表达式的略微修改版本:

r'\bdecimal\(\s*(\d+\s*,\s*\d+)\s*\)'

最重要的变化是添加了单词边界 ( \b) 以防止它匹配诸如snarfdecimal(4,1). 如果你真的必须使用match()而不是search(),你可以“填充”正则表达式.*?,强制它消耗中间字符:

r'.*?\bdecimal\(\s*(\d+\s*,\s*\d+)\s*\)'
于 2013-08-06T01:51:56.580 回答
1

你真的根本不需要使用积极的后视,

>>> import re
>>> find_decimal = re.compile(r'decimal\((\d+,\d+)\)')
>>> find_decimal.match('decimal(4,1)').group(1)
'4,1'

至于它不起作用的原因,不确定,但我猜你的想法是正确的。

于 2013-08-05T23:56:33.817 回答