Python Regex查找包含子字符串和don';不要再装了
我设法从该字符串中筛选出所有URL: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
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
标志进行不区分大小写的搜索
在这里测试它:
解释
要查找http://或https://https?:\/\/
是为了寻找有效的域名。我没有检查它是否真的是完全防弹的。但这似乎并不坏。我们也许可以找到一个官方的正则表达式来验证域名。[a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}
组是非捕获组(如果我们不需要它)(?:)
都放在一起并捕获到一个组中,这样我们就有了原始URL(https?:\/\/[a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6})
是一个正向的前瞻,因此前面的域后面必须跟有http或https。如果可以使用ftp或其他协议,则可能需要对其进行调整(?=https?
是将非空格匹配一次或多次,并将其捕获到一个组中(供以后使用和处理。必须处理第二个组,才能删除可能属于周围URL的第二个查询字符串(\S+)
)?param=x&option
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
标志进行不区分大小写的搜索
在这里测试它:
解释
要查找http://或https://https?:\/\/
是为了寻找一个有效的域名。我没有检查它是否真的完全是防弹的。但它似乎还不错。我们可以找到一个正式的正则表达式来验证域名。[a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}
组是一个非捕获组(如果我们不需要它的话)(?:)
都放在一起并捕获到一个组中,这样我们就有了原始URL(https?:\/\/[a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6})
是一个积极的前瞻,因此前面的域后面必须紧跟http或https。如果可以使用ftp或其他协议,则可能需要对其进行调整(?=https?
是将非空格匹配一次或多次,并将其捕获到一个组中(供以后使用和处理。必须处理第二个组,才能删除可能属于周围URL的第二个查询字符串(\S+)
)?param=x&option
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的有效链接有一种特殊的格式吗?中间的散列是找到它们的标记吗?谢谢你的建议!