如何在key子串和" /&#34之间提取字符串;与正则表达式?

时间:2016-06-27 22:27:47

标签: python regex

我有一个字符串

/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/。下一步是什么让我获得实际的文件名?

2 个答案:

答案 0 :(得分:3)

对于'(.*[\/]).*\?_subject_ID'正则表达式方法,您只需在第二个.*周围添加一个捕获组。您可以使用r'(.*/)(.*)\?_subject_ID'(然后会捕获.group(1).group(2)部分),但这不是解析Python中URL的最合适方式。

您可以在此处使用非正则表达式方法,这里有一个代码段,展示如何利用urlparseos.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

它与之前的基本相同,但是第一位被捕获而不是被忽略。