python正则表达式:html

python正则表达式:html,python,html,regex,Python,Html,Regex,我有一个html文件,其中包含一行: a = '<li><a href="?id=11&amp;sort=&amp;indeks=0,3" class="">H</a></li>' 我得到了预期的输出: ['?id=11&amp;sort=&amp;indeks=0,3'] 但是,当我向模式中添加“I”时,如下所示: re.findall(r'href="?i(\S+)"', a) 我得到: [ ] 陷阱在哪

我有一个html文件,其中包含一行:

a = '<li><a href="?id=11&amp;sort=&amp;indeks=0,3" class="">H</a></li>'
我得到了预期的输出:

['?id=11&amp;sort=&amp;indeks=0,3']
但是,当我向模式中添加“I”时,如下所示:

re.findall(r'href="?i(\S+)"', a)
我得到:

[ ]
陷阱在哪里?
提前谢谢。

问题是,
有特殊的含义,没有按字面意思匹配

要修复此问题,请更改您的正则表达式,如下所示:

re.findall(r'href="\?i(\S+)"', a)

否则,
将被视为应用于
”的可选修改。这碰巧起作用(偶然)在第一个示例中,但在第二个示例中不起作用。

我个人认为Python内置的HTMLPasser对于此类情况非常有用。我认为这一点也不过分——我认为它比正则表达式更具可读性和可维护性

>>> class HrefExtractor(HTMLParser.HTMLParser):
...     def handle_starttag(self, tag, attrs):
...         if tag == 'a':
...             attrs = dict(attrs)
...             if 'href' in attrs:
...                 print attrs['href']
... 
>>> he = HrefExtractor()
>>> he.feed('<a href=foofoofoo>')
foofoofoo
类HrefExtractor(HTMLParser.HTMLParser): …def handle_starttag(self、tag、attrs): …如果标记=='a': …attrs=dict(attrs) …如果属性中的“href”: …打印属性['href'] ... >>>he=HrefExtractor() >>>他。喂(“”) 福福
这里的要点是,
在正则表达式中有一个特殊的含义,它定义了任何内容的零次或一次出现。因此,如果您想从
标记中获取href值,应该使用-

re.findall(r'href="(\?\S+)"', a)
而不是

re.findall(r'href="?(\S+)"', a)

因此,如果你没有使用?的特殊含义,你应该像
\?
那样避开它,或者像
ab?
那样使用它,表示a或b。你使用?的方式是不正确的。

你应该使用解析器而不是正则表达式。虽然上面的链接对于解析HTML肯定是正确的,但问题是要找到包含
href=--对于正则表达式IMHO来说,这是一项非常简单的任务。相反,在这里使用HTML解析器可能被认为是过火了。感谢您指出我的错误。但是我确实需要搜索我已经从其他地方提取的模式,因此手动更改模式会很耗时。有没有办法让python忽略不计”?“图案中的字符(以及其他具有特殊意义的字符)?@priilane:是的,首先转义图案。
re.findall(r'href="?(\S+)"', a)