如何从字符串中提取子字符串?

时间:2012-11-26 03:02:45

标签: python

假设我有一个字符串/Apath1/Bpath2/Cpath3/0-1-2-3-4-5-something.otherthing我只想提取'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'部分?

4 个答案:

答案 0 :(得分:6)

使用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'

答案 1 :(得分:3)

你快到了:

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'。

答案 2 :(得分:1)

这有效:

>>> 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的其他建议可能更有意义(只要没有操作系统混淆正确的路径是什么样的)

答案 3 :(得分:0)

您可以使用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'

虽然稍微复杂一点,但似乎与此相似的解决方案可能会稍微强一些......