拆分字符串,但在Python中将分隔符保留在相同的结果子字符串中
我有一个包含URL的字符串:拆分字符串,但在Python中将分隔符保留在相同的结果子字符串中,python,regex,string,Python,Regex,String,我有一个包含URL的字符串: string=https://www.link1.net/abc/cik?xai=En8MmT__aF_nQm-F48&;sig=Cg0A7_5AE&;urlfix=1&;;ccurl=https://aax-us.link-two.com/x/c/Qoj_sZnkA%2526adurl%253Dhttp%253A%252F%252Fwww.link-三个。mu%252F 我想提取所有这些数据,得到如下结果: ['https://www.link1
string=https://www.link1.net/abc/cik?xai=En8MmT__aF_nQm-F48&;sig=Cg0A7_5AE&;urlfix=1&;;ccurl=https://aax-us.link-two.com/x/c/Qoj_sZnkA%2526adurl%253Dhttp%253A%252F%252Fwww.link-三个。mu%252F
我想提取所有这些数据,得到如下结果:
['https://www.link1.net/abc/cik?xai=En8MmT__aF_nQm-F48&;sig=Cg0A7_5AE&;urlfix=1&;ccurl=','https://aax-us.link-two.com/x/c/Qoj_sZnkA%2526adurl%253D“,”http%253A%252F%252Fwww.link three.mu%252F']
我正在努力:
urls = [x for x in re.split('(http[s]?)', string) if x]
print urls
结果是:
['https','://www.link1.net/abc/cik?xai=En8MmT\uu aF\u nQm-
F48&;sig=Cg0A7_5AE&;urlfix=1&;ccurl=','https','://aax us.link two.com/x/c/Qoj_sZnkA%2526durl%253D','http','%253A%252F%252fww.link three.mu%252F'.
如果URL可以以“http”或“https”开头,那么如何将完整的URL放在一起
有什么好主意吗?你可以利用你的成绩参加两个连续的比赛,这样就行了
urls = [urls[i]+urls[i+1] for i in range(0,len(urls),2)]
但最好使用findall
并对https?
或字符串结尾进行前瞻:
import re
string = "https://www.link1.net/abc/cik?xai=En8MmT__aF_nQm-F48&sig=Cg0A7_5AE&urlfix=1&;ccurl=https://aax-us.link-two.com/x/c/Qoj_sZnkA%2526adurl%253Dhttp%253A%252F%252Fwww.link-three.mu%252F"
print(re.findall("https?.*?(?=https?|$)",string))
结果:
['https://www.link1.net/abc/cik?xai=En8MmT__aF_nQm-F48&sig=Cg0A7_5AE&urlfix=1&;ccurl=',
'https://aax-us.link-two.com/x/c/Qoj_sZnkA%2526adurl%253D',
'http%253A%252F%252Fwww.link-three.mu%252F']
如注释中所述,由于您无法将
:
添加到分隔符中,因此无法确定URL分隔(如果URL在您的toast地址中包含http
)您可以使用您的结果并加入两个连续的匹配,这样就可以了
urls = [urls[i]+urls[i+1] for i in range(0,len(urls),2)]
但最好使用findall
并对https?
或字符串结尾进行前瞻:
import re
string = "https://www.link1.net/abc/cik?xai=En8MmT__aF_nQm-F48&sig=Cg0A7_5AE&urlfix=1&;ccurl=https://aax-us.link-two.com/x/c/Qoj_sZnkA%2526adurl%253Dhttp%253A%252F%252Fwww.link-three.mu%252F"
print(re.findall("https?.*?(?=https?|$)",string))
结果:
['https://www.link1.net/abc/cik?xai=En8MmT__aF_nQm-F48&sig=Cg0A7_5AE&urlfix=1&;ccurl=',
'https://aax-us.link-two.com/x/c/Qoj_sZnkA%2526adurl%253D',
'http%253A%252F%252Fwww.link-three.mu%252F']
如注释中所述,由于无法将
:
添加到分隔符中,因此无法确定URL分隔(如果URL在您的地址中包含http
)而不使用re
,您可以按如下方式处理此问题:
['http' + x for x in filter(lambda x: x, string.split('http'))]
结果将是:
['https://www.link1.net/abc/cik?xai=En8MmT__aF_nQm-
F48&sig=Cg0A7_5AE&urlfix=1&;ccurl=', 'https://aax-us.link-
two.com/x/c/Qoj_sZnkA%2526adurl%253D', 'http%253A%252F%252Fwww.link-
three.mu%252F']
不使用
re
,您可以按如下方式处理此问题:
['http' + x for x in filter(lambda x: x, string.split('http'))]
结果将是:
['https://www.link1.net/abc/cik?xai=En8MmT__aF_nQm-
F48&sig=Cg0A7_5AE&urlfix=1&;ccurl=', 'https://aax-us.link-
two.com/x/c/Qoj_sZnkA%2526adurl%253D', 'http%253A%252F%252Fwww.link-
three.mu%252F']
使用前瞻
(?=http)
。此外,无需将s
放入一个集合[s]
,因为默认情况下它是按字面解释的(它本身没有特殊含义)。此外,无需检查s
,因为http
是您真正需要查找的全部内容(想想看,如果http
存在,谁会在乎http
末尾是否有s
,因为它已经满足了您的第一个要求)。您尝试匹配的URL是什么?它们在哪里结束?你认为从代码开始> http%253a < /代码>一个有效的URL吗?这是一个URL <代码>https://aax-us.link-two.com/x/c/Qoj_sZnkA%2526adurl%253Dhttp%253A%252F%252Fwww.link-3.mu%252F是的,你说得对,http是我真正需要的。因此,整个字符串来自URL重定向方案,在该方案中,我需要提取链中的所有URL。现在,我正在对URL进行解码,然后再拆分它们,以便所有URL都以http://.Use 前瞻(?=http)
。此外,无需将s
放入一个集合[s]
,因为默认情况下它是按字面解释的(它本身没有特殊含义)。此外,无需检查s
,因为http
是您真正需要查找的全部内容(想想看,如果http
存在,谁会在乎http
末尾是否有s
,因为它已经满足了您的第一个要求)。您尝试匹配的URL是什么?它们在哪里结束?你认为从代码开始> http%253a < /代码>一个有效的URL吗?这是一个URL <代码>https://aax-us.link-two.com/x/c/Qoj_sZnkA%2526adurl%253Dhttp%253A%252F%252Fwww.link-3.mu%252F是的,你说得对,http是我真正需要的。因此,整个字符串来自URL重定向方案,在该方案中,我需要提取链中的所有URL。现在,我正在对URL进行解码,然后再拆分它们,以便所有URL都以http://.I 相信字符串方法通常比re
更快,因此这是一个比目前介绍的其他方法更好的解决方案。使用filter(无,string.split('http'))
,它甚至更干净。除此之外,regexYes还有一个很好的替代品,速度确实更快!我相信字符串方法通常比re
更快,因此这是一个比目前介绍的其他方法更好的解决方案。使用filter(None,string.split('http'))
,它甚至更干净。除此之外,regexYes还有一个很好的替代品,速度确实更快!测试和工作良好,但字符串方法在我的大型项目中工作得更快。我在另一个问题上使用了这个方法,经过测试,效果很好,但是字符串方法在我的大型项目中工作得更快。我把这个用在了另一个问题上。