1

得到以下字符串:

hash=49836EC32432A9B830BECFD66A9B6F936327EAE8

我需要匹配49836EC32432A9B830BECFD66A9B6F936327EAE8所以我这样做:

match = re.findall(".*hash=([A-F0-9]+).*",mydata)

一切都很酷,但是当我想打印它时

print "Hash: %s" % match

我明白了Hash: ['C5E8C500BA925237E399C44EFD05BCD4AAF76292']

我究竟做错了什么?我需要打印Hash: C5E8C500BA925237E399C44EFD05BCD4AAF76292

4

5 回答 5

3

findall为您提供字符串中所有匹配项的列表。您所看到的正是这一点 - 一个包含它找到的匹配项的列表。

search改为尝试: http : //docs.python.org/2/library/re.html#re.search 返回一个 MatchGroup,您可以获得第一组:http ://docs.python.org/2/library /re.html#match-objects

或者您可以findall使用列表中的第一个条目来打印(例如match[0])。

于 2013-05-09T04:58:53.370 回答
3
if match:
    print "Hash: %s" % match[0]
于 2013-05-09T05:08:36.537 回答
2

在您的代码中, match 是由 re.findall 函数产生的字符串列表( [1]: http://docs.python.org/2/library/re.html)。在此列表中,所有匹配项都按找到的顺序返回。在您的情况下,列表只有一个元素,即 match[0]。

于 2013-05-09T05:10:31.573 回答
2

这很简单:

In[1]: import re

In[2]: mydata = 'hash=49836EC32432A9B830BECFD66A9B6F936327EAE8'

In[3]: re.findall(".*hash=([A-F0-9]+).*",mydata)
Out[3]: ['49836EC32432A9B830BECFD66A9B6F936327EAE8'] # a list

In[4]: re.match(".*hash=([A-F0-9]+).*",mydata)
Out[4]: <_sre.SRE_Match at 0x5d79020>

In[5]: re.match(".*hash=([A-F0-9]+).*",mydata).groups()
Out[5]: ('49836EC32432A9B830BECFD66A9B6F936327EAE8',) # a tuple

In[6]: match = Out[3]

In[7]: print "Hash:",match[0] # so print the first item!!!
Hash: 49836EC32432A9B830BECFD66A9B6F936327EAE8

所以简而言之,将打印行更改为:

if match:
    print "Hash: %s" % match[0] # only first element!!
于 2013-05-09T05:11:27.610 回答
0

看起来它没有将 match 的值计算为字符串。我没有“mydata”,但是当我将哈希保存为字符串时,它打印得很好。看起来你的东西没有被转换为字符串,我认为这是匹配的值。我相信引号表明这已被转换为字符串。执行 type() 以查看其转换为什么,或尝试在 print 语句后键入 str(match) 而不是 match。

编辑:

其他人注意到它正在返回一个数组值。执行 match[0] 以返回数组的第一个值。

于 2013-05-09T05:04:14.273 回答