【问题标题】:Parse out a URL with regex operation in python在 python 中使用正则表达式操作解析 URL
【发布时间】:2016-12-30 21:18:16
【问题描述】:

我有如下数据,

数据

url
http://hostname.com/part1/part2/part3/a+b+c+d
http://m.hostname.com/part3.html?nk!e+f+g+h&_junk
http://hostname.com/as/ck$st=f+g+h+k+i/
http://www.hostname.com/p-l-k?wod=q+w+e+r+t africa

我想检查 url 中的第一个 + 符号并向后移动,直到找到特殊字符,例如 / 或 ?或 = 或任何其他特殊字符,然后从该字符开始,直到找到空格或行尾或 & 或 /。我的输出应该是,

parsed
abcd
efgh
fghki
qwert

我的目标是在 URL 中找到第一个 +,然后返回直到找到特殊字符,然后返回到前面,直到找到行尾或空格或 & 符号。

我是正则表达式的新手,还在学习它,因为它有点复杂,我发现很难写。任何人都可以帮助我在 python 中编写一个正则表达式来解析这些吗?

谢谢

【问题讨论】:

    标签: python regex python-2.7 python-3.x pyspark


    【解决方案1】:

    以下是适用于您的示例用例的表达式:

    >>> import re
    >>>
    >>> l = [
    ...     "http://hostname.com/part1/part2/part3/a+b+c+d",
    ...     "http://m.hostname.com/part3.html?nk!e+f+g+h&_junk",
    ...     "http://hostname.com/as/ck$st=f+g+h+k+i/",
    ...     "http://www.hostname.com/p-l-k?wod=q+w+e+r+t africa"
    ... ]
    >>>
    >>> pattern = re.compile(r"[^\w\+]([\w\+]+\+[\w\+]+)(?:[^\w\+]|$)")
    >>> for item in l:
    ...     print("".join(pattern.search(item).group(1).split("+")))
    ... 
    abcd
    efgh
    fghki
    qwert
    

    这个想法基本上是捕获字母数字和非字母数字和非加号字符之间的加号字符或字符串的结尾。然后,用加号分割并加入。

    Regex101 link.

    我感觉可以进一步简化/改进。

    【讨论】:

    • 假设如果我有这样的东西,hostname.com/as/ck$st=f+g-h-k-i,这个给出 f+g。我知道这不是最初的要求。但只是问。我们可以在检查第一个 + 之后检查 - 吗?通过不将其仅限制为“-”特殊字符以及除此之外的所有特殊字符?
    • @Observer 您应该将- 适当地添加到表达式中。例如。对于定义为pattern = re.compile(r"[^\w\+\-]([\w\+\-]+(?:\+|-)[\w\+\-]+)(?:[^\w\+\-]|$)") 的模式,使用re.split() 由多个分隔符分割:print("".join(re.split(r"\+|-", pattern.search("http://hostname.com/as/ck$st=f+g-h-k-i/").group(1)))) 将产生fghki。希望对您有所帮助。
    【解决方案2】:

    因此,解析所需字符的适当正则表达式是((.\+)+.) 我在这里使用 Javascript 正则表达式。但是,你应该也可以在 py 中实现。

    此正则表达式将从您的第一个 url 中提取 a+b+c+d。 从a+b+c+d 获取abcd 需要更多处理。

    稍后我会用 py 函数更新它。

    【讨论】:

    • 这给出了 a+b 的输出。不是 a+b+c+d
    • @你能把 a,b,c,d 看作单个词吗?为了简化,我在这里给出了它。它从两边取一封信。我想同时使用这两个词,直到我们找到一个字符。
    • 我的意思是我刚刚在控制台中做了这个。 var a = new RegExp(/((.\+)+.)/)a.exec('http://m.hostname.com/part3.html?nk!e+f+g+h&_junk')
    • 猜猜,你得到了上面的完整答案。
    • 是的,我得到了。非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 2012-08-23
    • 2011-03-20
    • 1970-01-01
    • 2020-09-12
    • 2010-10-23
    • 1970-01-01
    相关资源
    最近更新 更多