Python和re.compile返回不一致的结果

时间:2011-01-27 12:37:41

标签: python regex

我正在尝试将href="../directory"的所有实例替换为href="../directory/index.html"

在Python中,这个

reg = re.compile(r'<a href="../(.*?)">')
for match in re.findall(reg, input_html):
    output_html = input_html.replace(match, match+'index.html')

产生以下输出:

href="../personal-autonomy/index.htmlindex.htmlindex.htmlindex.html"  
href="../paternalism/index.html"  
href="../principle-beneficence/index.htmlindex.htmlindex.html"  
href="../decision-capacity/index.htmlindex.htmlindex.html" 

知道为什么它适用于第二个链接,但其他链接不适用?

来源的相关部分:

<p> 

 <a href="../personal-autonomy/">autonomy: personal</a> |
 <a href="../principle-beneficence/">beneficence, principle of</a> |
 <a href="../decision-capacity/">decision-making capacity</a> |
 <a href="../legal-obligation/">legal obligation and authority</a> |
 <a href="../paternalism/">paternalism</a> |
 <a href="../identity-personal/">personal identity</a> |
 <a href="../identity-ethics/">personal identity: and ethics</a> |
 <a href="../respect/">respect</a> |
 <a href="../well-being/">well-being</a> 

</p> 

编辑:重复的'index.html'实际上是多次匹配的结果。 (例如,href =“../ personal-autonomy / index.htmlindex.htmlindex.htmlindex.html”是因为原始来源中发现了四次../personal-autonomy。)

作为一般的正则表达式问题,如何在不向所有匹配项添加额外“index.html”的情况下替换所有实例?

5 个答案:

答案 0 :(得分:5)

Don't parse html with regexs:

import re    
from lxml import html

def replace_link(link):
    if re.match(r"\.\./[^/]+/$", link):
        link += "index.html"
    return link

print html.rewrite_links(your_html_text, replace_link)

输出

<p> 

 <a href="../personal-autonomy/index.html">autonomy: personal</a> |
 <a href="../principle-beneficence/index.html">beneficence, principle of</a> |
 <a href="../decision-capacity/index.html">decision-making capacity</a> |
 <a href="../legal-obligation/index.html">legal obligation and authority</a> |
 <a href="../paternalism/index.html">paternalism</a> |
 <a href="../identity-personal/index.html">personal identity</a> |
 <a href="../identity-ethics/index.html">personal identity: and ethics</a> |
 <a href="../respect/index.html">respect</a> |
 <a href="../well-being/index.html">well-being</a> 

</p>

答案 1 :(得分:1)

我想我发现了问题

reg = re.compile(r'<a href="../(.*?)">')

for match in re.findall(reg, input_html):

output_html = input_html.replace(match, match+'index.html')

这里'input_html'在for循环中被修改,然后再次搜索相同的'input_html'以获取正则表达式的错误:)

答案 2 :(得分:0)

让你的绑定逃脱前两个.

reg = re.compile(r'<a[ ]href="[.][.]/(.*?)">')

但我会尝试使用lxml代替。

答案 3 :(得分:0)

问题是a-tag的内容也与你尝试替换的内容相匹配。

这绝不是理想的做法,但我认为如果用以下内容替换你的正则表达式,你会发现它可以正常工作:

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

答案 4 :(得分:0)

正则表达式中存在错误,因为..与两个点不匹配。相反,它是. metacharacter。要表示一个点,你需要逃避它。

你的正则表达式应该是:<a href="\.\./(.*?)"

此外,假设所有您的href的格式为 ../ somedirectory / ,您可以使用更简单的正则表达式:

for match in re.compile(r'<a href="(.*?)"').findall(html):
    html = html.replace(match, match + "index.html")

这里,正则表达式匹配

<a href="    # start of the taf and attribute
(            # start of a group
 .*          # any character, any number of times
)            # end of group
"            # end of the attribute