Python - 提取子串最优雅的方式,给定左右边界

Python - Most elegant way to extract a substring, being given left and right borders

我有一个字符串 - 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]

这行得通,但我不喜欢它。 有人知道漂亮的功能或提示吗?

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

取决于您和您的数据。

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

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'

使用re(比其他解决方案慢):

>>> import re
>>> string = "/foo13546897/bar/Atlantis-GPS-coordinates/bar457822368/foo/"
>>> re.search(r'(?<=/bar/)[^/]+(?=/)', string).group()
'Atlantis-GPS-coordinates'
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. (?<=/bar/) 表示只处理后面的正则表达式,如果它在它之前(所以 /bar/ 必须在它之前) 2. '.+?/' 表示直到下一个 '/' char

之前的任意数量的字符

希望对一些人有所帮助。

如果您需要多次进行此类搜索,最好 'compile' 这种搜索性能更好,但如果您只需要进行一次,则不必费心。