0

我有一个存储在变量中的项目列表,如下所示:

listitems = ['<a href=\"\/other\/end\/f1\/738638\/adams\">Adams<\/a>\n', '<a href=\"\/other\/end\/f1\/23138\/donovan-smith\">Donovan Smith<\/a>\n']

我正在尝试查找人名,在我的示例中,名称是“Adams”和“Donovan Smith”,但是我需要帮助将特殊字符接受到模式中,通常您会使用反斜杠,但我想知道是否有一次接受多个特殊字符而不插入多个反斜杠的方法

我还想通配符(忽略)网络链接中的唯一编号和名称,例如:23138和“donovan-smith”

我当前的模式如下所示:

pattern1 = re.compile('<a href=\"\/other\/end\/f1\/23138\/donovan-smith\">(.*?)<\/a>\n')

任何帮助将非常感激。

4

1 回答 1

2

如果您正在做的是解析 html,为什么不尝试BeautifulSoupmechanize或者lxml.html

例如,

import lxml.html

listitems = ['<a href=\"\/other\/end\/f1\/738638\/adams\">Adams<\/a>\n', '<a href=\"\/other\/end\/f1\/23138\/donovan-smith\">Donovan Smith<\/a>\n']

string = ' '.join(listitems)

page = lxml.html.fromstring(string)

a_tags = page.cssselect('a')

names = []
for tag in a_tags:
  names.append(tag.text_content().strip())

print names
['Adams', 'Donovan Smith']

会给你你想要的。此外,您可以根据 xpath、css 等微调您选择的标签。

但是,如果您真的想自己编写正则表达式,那么您不从更简单的东西开始,例如

PATTERN = re.compile(r'<a.*?">(.*?)<\\/a>')

所以:

import re

listitems = ['<a href=\"\/other\/end\/f1\/738638\/adams\">Adams<\/a>\n', '<a href=\"\/other\/end\/f1\/23138\/donovan-smith\">Donovan Smith<\/a>\n']

PATTERN = re.compile(r'<a.*?">(.*?)<\\/a>')

names = []
for item in listitems:
  n = re.search(PATTERN, item).group(1)
  names.append(n)

print names
['Adams', 'Donovan Smith']
于 2013-08-01T00:29:11.957 回答