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' 这种搜索性能更好,但如果您只需要进行一次,则不必费心。
我有一个字符串 - 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' 这种搜索性能更好,但如果您只需要进行一次,则不必费心。