【问题标题】:Regex re.match() not returning match when it should [duplicate]正则表达式 re.match() 不应该返回匹配项 [重复]
【发布时间】:2020-03-21 19:56:15
【问题描述】:

我正在尝试从帖子标题中提取价格并将其与另一个价格进行比较。我发现这个正则表达式模式:\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

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

【问题讨论】:

  • 您尝试从中提取的帖子标题的示例是什么?
  • "[RAM] G.SKILL Ripjaws V 系列 16GB (2 x 8GB) DDR4 3600mhz $69.99"
  • 嗯,好的。那么在这种情况下re.match 是从字符串的开头开始的。因此,您需要通过 .*?\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{2} 或在 \d{1,3}(?:[.,]\d{3})*(?:[.,]\d{2} 上执行 re.findall 来解决这一问题

标签: python regex python-3.x string parsing


【解决方案1】:

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'

【讨论】:

  • 啊,我看到与其他语言不同,re.match() 只从字符串的开头扫描。这很令人困惑。谢谢你的解释,我就用 findall()
猜你喜欢
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 2022-01-14
  • 2017-05-25
  • 1970-01-01
相关资源
最近更新 更多