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