难以写出正确的正则表达式

时间:2013-05-01 08:09:53

标签: python regex

我正在尝试匹配以下文字中的项目编号:

User Number 1 will probably like movie ID: RecommendedItem[item:557, value:7.32173]the most!

以下是我的尝试:

 myfile = open('result.txt', 'r')

 for line in myfile:
  m = re.search('(?<=RecommendedItem\[item:).+,', line)
  print m

然而,这给了我一个错误:

<_sre.SRE_Match object at 0x106e79168>

我想知道断言背后可能出现什么问题...(Lookbehind断言似乎不适用于regexpal.com,即使是简单的事情(?&lt; = a)b也会以红色突出显示)

3 个答案:

答案 0 :(得分:4)

这不是错误! re.search的结果是MatchObject。其中包含匹配的内容,可通过MatchObject.group(groupNumber,...)访问(其他方式,例如groups()等),如下所述:group。你需要一个正则表达式来做你所要求的:

import re
t = "User Number 1 will probably like movie ID: RecommendedItem[item:557, value:7.32173]the most!"
itemNumber = re.search(r'(?<=RecommendedItem\[item:)(\d+)',t)
print(itemNumber.group(0))

或者,使用命名组:

import re
t = "User Number 1 will probably like movie ID: RecommendedItem[item:557, value:7.32173]the most!"
itemNumber = re.search(r'(?<=RecommendedItem\[item:)(?P<itemNumber>\d+)',t)
print(itemNumber.groupdict()["itemNumber"]) #note using groupdict() not group()

>>> 
557

答案 1 :(得分:1)

要获得正则表达式的匹配部分,您应该使用

if m:
    print line[m.start():m.end()]

或者您可以使用返回匹配列表的re.findall函数:

m = re.findall('(?<=RecommendedItem\[item:).+,', line))
if m:
    print m[0]

您可能还想稍微修改您的正则表达式,不要在末尾使用逗号:'(?<=RecommendedItem\[item:)\d+

答案 2 :(得分:1)

要从匹配对象中获取项目编号,请尝试打印m.groups()。

有关“m”

的其他信息,请参阅http://docs.python.org/2/library/re.html#match-objects