Python 如何从字符串内部提取子字符串?

Python 如何从字符串内部提取子字符串?,python,Python,假设我有一个字符串/Apath1/Bpath2/Cpath3/0-1-2-3-4-5-something。其他的我只想提取“0-1-2-3-4-5”部分。我试过这个: str='/Apath1/Bpath2/Cpath3/0-1-2-3-4-5-something.otherhing' print str[str.find("-")-1:str.find("-")] 但是,结果只有0。如何仅提取“0-1-2-3-4-5”部分?使用os.path.basename和rsplit: >&g

假设我有一个字符串
/Apath1/Bpath2/Cpath3/0-1-2-3-4-5-something。其他的
我只想提取“0-1-2-3-4-5”部分。我试过这个:

str='/Apath1/Bpath2/Cpath3/0-1-2-3-4-5-something.otherhing'

print str[str.find("-")-1:str.find("-")]

但是,结果只有0。如何仅提取“0-1-2-3-4-5”部分?

使用os.path.basename和rsplit:

>>> from os.path import basename
>>> name = '/Apath1/Bpath2/Cpath3/0-1-2-3-4-5-something.otherhing'
>>> number, tail = basename(name).rsplit('-', 1)
>>> number
'0-1-2-3-4-5'
你就快到了:

str='/Apath1/Bpath2/Cpath3/0-1-2-3-4-5-something.otherhing'
print str[str.find("-")-1:str.rfind("-")]
rfind
将从末尾搜索。这假定路径中的任何其他位置都不显示破折号。如果可以,请改为:

str='/Apath1/Bpath2/Cpath3/0-1-2-3-4-5-something.otherhing'
str = os.path.basename(str)
print str[str.find("-")-1:str.rfind("-")]
basename
将获取文件名,不包括路径的其余部分。那可能是你想要的

编辑:

正如@bradley.ayers所指出的,如果问题中没有准确描述文件名,则会出现这种情况。由于我们使用的是
basename
,因此可以省略起始索引:

print str[:str.rfind("-")]
这将把“/Apath1/Bpath2/Cpath3/10-1-2-3-4-5-something.otherhing”解析为“10-1-2-3-4-5”。

>>> str='/Apath1/Bpath2/Cpath3/0-1-2-3-4-5-something.otherhing'
>>> str.split('/')[-1].rsplit('-', 1)[0]
'0-1-2-3-4-5'

假设您想要的只是介于最后一个“/”和最后一个“-”之间的内容。关于
os.path
的其他建议可能更有意义(只要操作系统不混淆正确的路径是什么样子的)

您可以使用
re

>>> import re
>>> ss = '/Apath1/Bpath2/Cpath3/0-1-2-3-4-5-something.otherhing'
>>> re.search(r'(?:\d-)+\d',ss).group(0)
'0-1-2-3-4-5'

虽然稍微复杂一点,但类似于此的解决方案可能会稍微稳健一些……

您想如何确定提取什么?你说你想提取“0-1-2-3-4-5”,但你如何通过查看它来决定这是你想要提取的?如果字符串中的其他地方还有一个连字符呢?+1我想我更喜欢这个
rsplit
比切片更干净。如果它是
'/Apath1/Bpath2/Cpath3/10-1-2-3-4-5-something.otherhing'
?@bradley.ayers-那么他会得到
10-1-2-3-4-5
,就像预期的那样。@bradley.ayers-捕捉得好。我对OP的示例进行了必要的最小更改,但忘记了使代码健壮。更新了一个补丁。