【问题标题】:How to extract string between key substring and "/" with regex?如何使用正则表达式提取键子字符串和“/”之间的字符串?
【发布时间】:2016-06-27 22:27:46
【问题描述】:

我有一个字符串

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

【问题讨论】:

  • 使用您的方法:r'.*/(.*)\?_subject_ID' 并使用 group(1) 访问
  • 呃,你确定示例字符串是准确的吗?
  • @QPaysTaxes 修复了它。它现在应该可以工作了
  • @WiktorStribiżew group(1) 得到我的/path/to/,我应该使用这个子字符串和?_subject_ID 的索引吗?

标签: python regex


【解决方案1】:

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

您可以在这里使用非正则表达式方法,这里是一个 sn-p,展示了如何利用 urlparseos.path 来解析 URL:

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

【讨论】:

    【解决方案2】:

    真的很简单。只需匹配之前的/ 和之后的?subject_ID

    ([^/?]*)\?subject_ID
    

    [^/?]*(相对于.*)是因为否则它也会匹配之前的部分。字符类中的?

    如果你想同时获取路径和文件,你可以做很多相同的事情,但也可以获取/之前的部分:

    ([^?]*)([^/?]*)\?subject_ID
    

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

    【讨论】:

    • Urg,糟糕的互联网对于尝试编辑答案是糟糕。当我可以使它工作时,我将添加在线测试,但现在,您可以将代码粘贴到 Regex101
    • @WiktorStribiżew 我知道。我在尝试编辑它时遇到了很多麻烦。酒店 WiFi 似乎不够可靠,无法快速完成任何事情。
    • @CasimiretHippolyte 好点。那要么是复制/粘贴错误,要么是脑子放屁;任你选。
    • 不,我是说[^/?]
    • @CasimiretHippolyte 哦,我明白了。这有什么好处吗?
    猜你喜欢
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2014-06-12
    相关资源
    最近更新 更多