Python - 提取子字符串的最优雅方式,给出左右边框

时间:2016-01-17 01:55:14

标签: python string find

我有一个字符串 - Python:

string = "/foo13546897/bar/Atlantis-GPS-coordinates/bar457822368/foo/"

预期输出为:

"Atlantis-GPS-coordinates"

我知道预期的输出总是被左边的“/ bar /”和右边的“/”包围:

"/bar/Atlantis-GPS-coordinates/"

建议的解决方案如下:

a = string.find("/bar/")
b = string.find("/",a+5)
output=string[a+5,b]

这有效,但我不喜欢它。 有人知道一个美丽的功能或提示吗?

4 个答案:

答案 0 :(得分:10)

您可以使用split

>>> string.split("/bar/")[1].split("/")[0]
'Atlantis-GPS-coordinates'

添加最大分割1的一些效率我认为:

>>> string.split("/bar/", 1)[1].split("/", 1)[0]
'Atlantis-GPS-coordinates'

或使用partition

>>> string.partition("/bar/")[2].partition("/")[0]
'Atlantis-GPS-coordinates'

或正则表达式:

>>> re.search(r'/bar/([^/]+)', string).group(1)
'Atlantis-GPS-coordinates'

取决于您和您的数据的对象。

答案 1 :(得分:3)

你没有的并不是那么糟糕。我把它写成:

start = string.find('/bar/') + 5
end = string.find('/', start)
output = string[start:end]

只要您知道/bar/WHAT-YOU-WANT/总会出现。否则,我会找到regular expression knife

>>> import re
>>> PATTERN = re.compile('^.*/bar/([^/]*)/.*$')
>>> s = '/foo13546897/bar/Atlantis-GPS-coordinates/bar457822368/foo/'
>>> match = PATTERN.match(s)
>>> match.group(1)
'Atlantis-GPS-coordinates'

答案 2 :(得分:1)

import re

pattern = '(?<=/bar/).+?/'
string = "/foo13546897/bar/Atlantis-GPS-coordinates/bar457822368/foo/"

result = re.search(pattern, string)
print string[result.start():result.end() - 1]
# "Atlantis-GPS-coordinates" 

这是一个Python 2.x示例。它首先做的是: 1.(?&lt; = / bar /)表示只处理以下正则表达式(如果/ bar /必须在它之前) 2.&#39;。+?/&#39;表示任何数量的字符,直到下一个&#39; /&#39;炭

希望有所帮助。

如果你需要进行这种搜索,最好是编译&#39;这是对性能的追求,但如果你只需要这样做就不要打扰。

答案 3 :(得分:0)

使用mydomain.pk(比其他解决方案慢):

Host