我有一个字符串
/path/to/file?_subject_ID_SOMEOTHERSTRING
路径/到/文件部分的更改取决于具体情况,subject_ID
始终存在。我尝试编写一个只提取字符串file
部分的正则表达式。使用?subject_ID
是明确的,但我不知道如何安全地获取file
我目前的正则表达式看起来像(.*[\/]).*\?_subject_ID
url = '/path/to/file?_subject_ID_SOMEOTHERSTRING'
file_re = re.compile('(.*[\/]).*\?_subject_ID')
file_re.search(url)
这会找到正确的字符串,但我仍然无法提取文件名
打印_.group(1)会得到/path/to/
。下一步是什么让我获得实际的文件名?
答案 0 :(得分:3)
对于'(.*[\/]).*\?_subject_ID'
正则表达式方法,您只需在第二个.*
周围添加一个捕获组。您可以使用r'(.*/)(.*)\?_subject_ID'
(然后会捕获.group(1)
和.group(2)
部分),但这不是解析Python中URL的最合适方式。
您可以在此处使用非正则表达式方法,这里有一个代码段,展示如何利用urlparse
和os.path
来解析您的网址:
import urlparse
path = urlparse.urlparse('/path/to/file?_subject_ID_SOMEOTHERSTRING').path
import os.path
print(os.path.split(path)[1]) # => file
print(os.path.split(path)[0]) # => /path/to
请参阅IDEONE demo
答案 1 :(得分:2)
非常简单,真的。只需匹配之前的/
和之后的?subject_ID
:
([^/?]*)\?subject_ID
[^/?]*
(与.*
相对)是因为否则它也会与之前的部分匹配。字符类中的?
如果你想同时获得路径和文件,你可以做同样的事情,但也可以在/
之前抓取部分:
([^?]*)([^/?]*)\?subject_ID
它与之前的基本相同,但是第一位被捕获而不是被忽略。