【问题标题】:Regex not working as required正则表达式未按要求工作
【发布时间】:2016-07-27 09:45:37
【问题描述】:

这是我的 HTML 代码:

<ul class="hide menuSearchType">
    <li><a href="../../dynamic/city_select.aspx">Search by city</a></li>
    <li><a href="../../searchbyphone.aspx">Search by phone</a></li>
    <li><a href="../searchbyaddress.aspx">Search by address</a></li>
    <li><a href="../searchbybrand.aspx">Search by brand</a></li>
    <li><a href="/advertisement-center/">Advertise with us</a></li>
    <li><a href="/advertisement-center/">Advertise with us</a></li>
    <li><a href="//fonts.googleapis.com/css?family=Open+Sans">Find a Person</a></li>
    <li><a href="//fonts.googleapis.com/css?family=Open+Sans">Find a Person</a></li>
    <li><a href="dynamic/city_select.aspx">Search by city</a></li>
    <li><a href="searchbybrand.aspx">Search by brand</a></li>
</ul>

这是我的 Python 代码:

import re, os
from urllib.parse import urlparse

url = "http://www.phonebook.com.pk/dynamic/search.aspx?searchtype=cat&class_id=2566" 

path = urlparse(url)
lpath = os.path.dirname(path.path)

html = u"<ul class=\"hide menuSearchType\">\n    <li><a href=\"../../dynamic/city_select.aspx\">Search by city</a></li>\n    <li><a href=\"../../searchbyphone.aspx\">Search by phone</a></li>\n    <li><a href=\"../searchbyaddress.aspx\">Search by address</a></li>\n    <li><a href=\"../searchbybrand.aspx\">Search by brand</a></li>\n    <li><a href=\"/advertisement-center/\">Advertise with us</a></li>\n    <li><a href=\"/advertisement-center/\">Advertise with us</a></li>\n    <li><a href=\"//fonts.googleapis.com/css?family=Open+Sans\">Find a Person</a></li>\n    <li><a href=\"//fonts.googleapis.com/css?family=Open+Sans\">Find a Person</a></li>\n    <li><a href=\"dynamic/city_select.aspx\">Search by city</a></li>\n    <li><a href=\"searchbybrand.aspx\">Search by brand</a></li>\n</ul>"

linkList1 = re.findall(re.compile(u'(?<=href=")../.*?(?=")'), str(html))

for link1 in linkList:
    html = re.sub(link1, path.scheme + "://" + os.path.normpath(path.netloc + os.path.abspath(lpath + "/" + link1)), str(html))

print (html)

问题是它按预期检测到带有“../”的链接,但“../../”也发生了变化,有什么办法可以限制我的正则表达式只选择带有单个“../”的网址“?

预期输出:

<ul class="hide menuSearchType">
    <li><a href="../../dynamic/city_select.aspx">Search by city</a></li>
    <li><a href="../../searchbyphone.aspx">Search by phone</a></li>
    <li><a href="http://www.phonebook.com.pk/searchbyaddress.aspx">Search by address</a></li>
    <li><a href="http://www.phonebook.com.pk/searchbybrand.aspx">Search by brand</a></li>
    <li><a href="/advertisement-center/">Advertise with us</a></li>
    <li><a href="/advertisement-center/">Advertise with us</a></li>
    <li><a href="//fonts.googleapis.com/css?family=Open+Sans">Find a Person</a></li>
    <li><a href="//fonts.googleapis.com/css?family=Open+Sans">Find a Person</a></li>
    <li><a href="dynamic/city_select.aspx">Search by city</a></li>
    <li><a href="searchbybrand.aspx">Search by brand</a></li>
</ul>

【问题讨论】:

  • 请使用解析器而不是正则表达式...
  • @ThomasAyoub 亲爱的先生,我不允许使用除正则表达式之外的任何东西。我公司的限制。
  • 这里不适用,当你听到老板说他有权为所欲为时。
  • 你能发布你预期的输出,这样我就可以用正则表达式给你更好的解决方案
  • @akashkarothiya 添加了预期的输出。

标签: python html regex


【解决方案1】:

按要求使用 BeautifulSoup :

from bs4 import Beautifulsoup
soup = BeautifulSoup(html)
all = soup.select('li')
for i in all:
    try:
        output = re.sub(r'(?is)(href="../)([^.])','http://www.phonebook.com.pk/'+r'\2',str(i))
    except:
        output = i
    print(output)

【讨论】:

    【解决方案2】:

    您可以使用正则表达式替换字符串,

    output = re.sub(r'(?is)(href="../)([^.])','http://www.phonebook.com.pk/'+r'\2',str(html))
    

    【讨论】:

    • 我会在@GiftZwergrapper 方法之后尝试。
    • 它也在两个链接中选择“/”之后的第一个“s”
    • 正则表达式运行良好,但在 python 代码中它给出了奇怪的输出。
    • 你能告诉我如何在 BS4 中执行此操作吗,我将不胜感激,正则表达式无法解决问题,我不使用 BS4 的唯一原因是因为它很慢而且我不习惯它。
    • 给你,看下面的答案
    【解决方案3】:

    尝试使用以下方法:

    linkList1 = re.findall(re.compile(u'(?<=href=")../\w.*?(?=")'), str(html))
    

    这保证斜线后面必须有一个单词字符。

    【讨论】:

    • 谢谢,你解决了我的问题,我花了 10 多个小时来测试不同的东西。
    • 没问题,但你应该考虑使用解析器而不是正则表达式,即使你的老板不喜欢它。
    • @Giftwergrapper 好的,我会努力说服他的。
    • 正则表达式运行良好,但在 python 代码中它给出了奇怪的输出。
    猜你喜欢
    • 2017-01-21
    • 2014-04-28
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多