re.findall - 将id与名称匹配

时间:2013-12-16 14:46:26

标签: python regex find

我在将ID与正确的帐户匹配时遇到了一个小问题: HTML代码如下所示:

<a href="javascript:UserWindow('Mike','14','0','27s', 'profile')">
<a href="user.php?id=14">Mike</a>

当我运行时:

IDs = re.findall('(?<=user.php\?id=)\w+(?=\">)', src)
names = re.findall('(?<=UserWindow\(\')\w+(?=\',\')', src)

例如Mike有ID 11而不是14.我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

你应该使用正确的html解析器,例如beautifulsoup

import bs4

html = """<a href="javascript:UserWindow('Mike','14','0','27s', 'profile')">
<a href="user.php?id=14">Mike</a>"""

soup = bs4.BeautifulSoup(html) #Prepare the soup!
name = [i.string for i in soup.findAll('a') if 'user.php' in i['href']]
id = [i['href'].replace('user.php?id=','') for i in soup.findAll('a') if 'user.php' in i['href']]

dictionary = dict(zip(name,id))
print dictionary

输出:

{u'Mike': u'14'}

但是如果你需要正则表达式

试试这个:

name = re.findall('user.php\?id=\d+">(\w+)',string)
id =re.findall('user.php\?id=(\d+)',string)
dictionary = dict(zip(name,id))
print dictionary

输出:

{'Mike': '14'}

注意:要获取字典,只需将内置zip函数与dict()函数结合使用

答案 1 :(得分:2)

据我所知,问题是将名称与找到的ID对齐。您是否尝试使用一个正则表达式来查找名称和ID的

src = """
<a href="user.php?id=14">Mike</a>
<a href="user.php?id=11">Foo</a>
<a href="user.php?id=13">Bar</a>
"""
import re
pairs = re.findall(r'href="user.php\?id=(\d+)">(\w+)</a>', src)
print pairs

输出:[('14', 'Mike'), ('11', 'Foo'), ('13', 'Bar')]您可能想要调整表达式以允许包含空格等的名称,但一般的想法应该有效。

您还可以轻松地创建字典(将ID映射到名称),dict(pairs)将为您提供{'11': 'Foo', '13': 'Bar', '14': 'Mike'}