首页 > 解决方案 > 正则表达式 re.match() 不应该返回匹配

问题描述

我正在尝试从帖子标题中提取价格并将其与另一个价格进行比较。我发现了这个正则表达式模式:\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{2})完全符合我的需求。

我在https://regexr.com/上对其进行了测试,它返回了正确的匹配项。但是,当我尝试在 python 3 中执行此操作时,我找不到匹配项。这是代码的样子:

def isPriceBetter(CurrentPrice, title):
   r = re.compile(r'\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{2})')
   newPrice = r.match(title)

   if newPrice == None:
       return False
   newPrice = float(newPrice)
   if newPrice > CurrentPrice:
       return False
   return True

newPriceNone即使我测试了与代码在https://regexr.com/上测试的完全相同的字符串并且它返回匹配项,变量也总是如此。起初我认为我的模式字符串可能被错误地转义,这就是为什么我把 'r' 放在引号前面。我也尝试添加更多的 '\' 字符,但这也没有用。

标签: pythonregexpython-3.xstringparsing

解决方案


re.match将从字符串的开头开始。因为字符串不是以数字开头的,所以不会匹配。你可以改用这样的东西:

假设s="[RAM] G.SKILL Ripjaws V Series 16GB (2 x 8GB) DDR4 3600mhz $69.99"

In [1]: regex = re.compile('\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{2})')                                  

In [2]: regex.findall(s)                                                                          
Out[2]: ['69.99']

或者您需要考虑whatever在字符串的开头,您可以像这样创建匹配group

In [1]: regex = re.compile('.*?(?P<price>\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{2}))')                    

In [2]: match = regex.match(s)                                                                    

In [3]: match                                                                                     
Out[3]: <re.Match object; span=(0, 65), match='[RAM] G.SKILL Ripjaws V Series 16GB (2 x 8GB) DDR>

In [4]: match.group('price')                                                                      
Out[4]: '69.99'

推荐阅读