Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Regex查找包含子字符串和don';不要再装了_Python_Regex - Fatal编程技术网

Python Regex查找包含子字符串和don';不要再装了

Python Regex查找包含子字符串和don';不要再装了,python,regex,Python,Regex,我设法从该字符串中筛选出所有URL: hi, this is your link (but this one is bad formatted and useless): https://www.test.comhttps://app.test.com/a/b/c/5e20bed422e7880012ba8acc/next?param=1?locale=2 but there is a good link too: https://app.test.com/a/b/c/5e20bed422

我设法从该字符串中筛选出所有URL:

hi, this is your link (but this one is bad formatted and useless):

https://www.test.comhttps://app.test.com/a/b/c/5e20bed422e7880012ba8acc/next?param=1?locale=2

but there is a good link too:

https://app.test.com/a/b/c/5e20bed422e7880012ba8acc/next?param=1?locale=2

and there are also other irrelevant links:

http://www.google.com
http://test.test.com
用这个正则表达式

http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+
在玩了一段时间后,我一直在试图弄清楚如何调整它,只得到:

https://www.test.com/a/b/c/5e20bed422e7880012ba8acc/next?param=1?locale=2
过滤出包含“/next”但不包含“comhttps”的URL的最简单方法是什么


非常感谢

像这样的东西怎么样

(https?:\/\/[a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6})(?=https?(\S+)
我们将使用
i
标志进行不区分大小写的搜索

在这里测试它:

解释
  • https?:\/\/
    要查找http://或https://

  • [a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}
    是为了寻找有效的域名。我没有检查它是否真的是完全防弹的。但这似乎并不坏。我们也许可以找到一个官方的正则表达式来验证域名。
    (?:)
    组是非捕获组(如果我们不需要它)

  • (https?:\/\/[a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6})
    都放在一起并捕获到一个组中,这样我们就有了原始URL

  • (?=https?
    是一个正向的前瞻,因此前面的域后面必须跟有http或https。如果可以使用ftp或其他协议,则可能需要对其进行调整

  • (\S+)
    是将非空格匹配一次或多次,并将其捕获到一个组中(供以后使用和处理。必须处理第二个组,才能删除可能属于周围URL的第二个查询字符串
    ?param=x&option

编辑 因为我们讨论了只匹配正确的答案,这意味着我的答案不是很好。要理解要做什么并不总是容易的

在这里,我们查找的URL的域后面没有
http:
https:

诀窍是在开头添加
\b
,以避免与URL内的URL匹配,并在域后使用负前瞻

\bhttps?:\/\/[a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}(?!https?:)\/\S+\/next\?(\S+)
使用
(?!https?:)
(我没有添加双斜杠,因为我认为它足够了)


带有
/next
的最后一部分可能没有必要。这取决于您是否希望将URL与内部URL具体匹配。

类似的内容如何

(https?:\/\/[a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6})(?=https?(\S+)
我们将使用
i
标志进行不区分大小写的搜索

在这里测试它:

解释
  • https?:\/\/
    要查找http://或https://

  • [a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}
    是为了寻找一个有效的域名。我没有检查它是否真的完全是防弹的。但它似乎还不错。我们可以找到一个正式的正则表达式来验证域名。
    (?:)
    组是一个非捕获组(如果我们不需要它的话)

  • (https?:\/\/[a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6})
    都放在一起并捕获到一个组中,这样我们就有了原始URL

  • (?=https?
    是一个积极的前瞻,因此前面的域后面必须紧跟http或https。如果可以使用ftp或其他协议,则可能需要对其进行调整

  • (\S+)
    是将非空格匹配一次或多次,并将其捕获到一个组中(供以后使用和处理。必须处理第二个组,才能删除可能属于周围URL的第二个查询字符串
    ?param=x&option

编辑 因为我们讨论了只匹配正确的答案,这意味着我的答案不是很好。要理解要做什么并不总是容易的

在这里,我们查找的URL的域后面没有
http:
https:

诀窍是在开头添加
\b
,以避免与URL内的URL匹配,并在域后使用负前瞻

\bhttps?:\/\/[a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}(?!https?:)\/\S+\/next\?(\S+)
使用
(?!https?:)
(我没有添加双斜杠,因为我认为它足够了)

带有
/next
的最后一部分可能没有必要。这取决于您是否希望将URL与内部URL具体匹配。

使用:

\bhttps?://(?=[\w.]*/)(?:(?!https?://).)*
它会找到正确的url,并从您的示例中拒绝其他url


输出:

['https://app.test.com/a/b/c/5e20bed422e7880012ba8acc/next?param=1?locale=2']
使用:

它会找到正确的url,并从您的示例中拒绝其他url


输出:

['https://app.test.com/a/b/c/5e20bed422e7880012ba8acc/next?param=1?locale=2']

一个快速的解决方案是检查结束字符串($)是否为locale=2,但这取决于您的所有字符串是否都是这样。是否有专门的库用于此?一个快速的解决方案是检查结束字符串($)是locale=2,但这取决于您的所有字符串是否都是这样。没有专门的库吗?谢谢您的建议!此正则表达式只过滤出坏链接(第一个链接,其中包含“comhttps”)。有没有一种方法可以在一个表达式中过滤掉它?@MartR好吧,只要不使用任何内容激活完全匹配的替换,它就会从您的内容中删除。请看这里:@MartR Haaa,我明白了,您只想找到有效的链接?是吗?谢谢!我不确定您所说的“不使用任何内容激活完全匹配的替换”是什么意思“嗯,所以我必须回到书里:”MartR的有效链接有一种特殊的格式吗?中间的散列是找到它们的标记吗?谢谢你的建议!