在最后一个正斜杠之前删除部分字符串
Posted
技术标签:
【中文标题】在最后一个正斜杠之前删除部分字符串【英文标题】:Remove Part of String Before the Last Forward Slash 【发布时间】:2015-06-21 20:04:26 【问题描述】:我目前正在开发的程序从网站检索 URL 并将它们放入列表中。我想得到的是 URL 的最后一部分。
因此,如果我的 URL 列表中的第一个元素是 "https://docs.python.org/3.4/tutorial/interpreter.html"
,我想删除 "interpreter.html"
之前的所有内容。
我可以使用函数、库或正则表达式来实现这一点吗?我查看了其他 Stack Overflow 帖子,但解决方案似乎不起作用。
这是我的几次尝试中的两次:
for link in link_list:
file_names.append(link.replace('/[^/]*$',''))
print(file_names)
&
for link in link_list:
file_names.append(link.rpartition('//')[-1])
print(file_names)
【问题讨论】:
你怎么知道他们没有工作?您收到错误消息了吗? @Kevin 输出不正确。 为什么你的rpartition()
尝试用反斜杠而不是正斜杠分割?
@TigerhawkT3 对不起。刚刚修好了
现在它在一对正斜杠上而不是一个斜杠上拆分(正斜杠不需要转义)。
【参考方案1】:
看看str.rsplit
。
>>> s = 'https://docs.python.org/3.4/tutorial/interpreter.html'
>>> s.rsplit('/',1)
['https://docs.python.org/3.4/tutorial', 'interpreter.html']
>>> s.rsplit('/',1)[1]
'interpreter.html'
并使用正则表达式
>>> re.search(r'(.*)/(.*)',s).group(2)
'interpreter.html'
然后匹配位于最后一个/
和字符串结尾之间的第二组。这是 RegEx 中贪心技术的一种贪婪用法。
Debuggex Demo
小提示 - 代码中link.rpartition('//')[-1]
的问题在于您尝试匹配//
而不是/
。所以删除多余的/
,就像link.rpartition('/')[-1]
一样。
【讨论】:
【参考方案2】:这不需要正则表达式。
import os
for link in link_list:
file_names.append(os.path.basename(link))
【讨论】:
是的,这也很快。这是解析这些类型的字符串的更强大的方法,imo【参考方案3】:只需使用 string.split:
url = "/some/url/with/a/file.html"
print url.split("/")[-1]
# Result should be "file.html"
split 为您提供一个由“/”分隔的字符串数组。 [-1] 为您提供数组中的最后一个元素,这就是您想要的。
【讨论】:
【参考方案4】:如果您打算使用正则表达式,这应该可以工作
for link in link_list:
file_names.append(link.replace('.*/',''))
print(file_names)
【讨论】:
【参考方案5】:你可以使用rpartition():
>>> s = 'https://docs.python.org/3.4/tutorial/interpreter.html'
>>> s.rpartition('/')
('https://docs.python.org/3.4/tutorial', '/', 'interpreter.html')
并取返回的 3 元素元组的最后一部分:
>>> s.rpartition('/')[2]
'interpreter.html'
【讨论】:
可能是因为如果字符串使用反斜杠作为文件结构分隔符,/
上的拆分将不起作用......但这对于 URL 来说不是问题,所以我不确定。
这太棒了!【参考方案6】:
这是一种更通用的正则表达式方式:
re.sub(r'^.+/([^/]+)$', r'\1', "http://test.org/3/files/interpreter.html")
'interpreter.html'
【讨论】:
以上是关于在最后一个正斜杠之前删除部分字符串的主要内容,如果未能解决你的问题,请参考以下文章
使用用户提交的内容重新填充 textarea(使用 ASCII 代码并且在某些字符之前没有附加的正斜杠)