Python - 给定左右边界,提取子字符串的最优雅方法是什么?

18

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

这个方法可行,但我不喜欢它。 有人知道一个更好的函数或技巧吗?


1
string.split("/bar/")[1].split("/")[0] - dawg
4个回答

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

取决于你和你的数据之间的关系。


喜欢你的回答。我会验证它。拆分和分区有哪些优点/缺点? - Vincent
主要区别在于如果没有 /bar/,每个函数如何处理分割。partition 总是生成一个三元组,其中包含分割元素未找到时的空字符串。split 更改了生成的列表中的元素数量。使用 partition 更容易测试它是否按预期工作。如果我知道字符串可以成功拆分,我会使用 split;如果需要测试,则使用 partition 或正则表达式。 - dawg

4

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

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

只要你知道/bar/WHAT-YOU-WANT/始终存在,否则我会使用正则表达式来解决:
>>> import re
>>> PATTERN = re.compile('^.*/bar/([^/]*)/.*$')
>>> s = '/foo13546897/bar/Atlantis-GPS-coordinates/bar457822368/foo/'
>>> match = PATTERN.match(s)
>>> match.group(1)
'Atlantis-GPS-coordinates'

你的正则表达式组缺少一个闭合括号。 - Martin Konecny
@MartinKonecny 确实。谢谢。 - D.Shawley

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. (?<=/bar/) 表示只有在其前面有/bar/时才处理以下正则表达式(因此/bar/必须在其前面) 2. '.+?/' 表示任意数量的字符,直到下一个'/'字符为止。
希望这能帮到您一些。
如果您需要经常进行此类搜索,则最好为性能而“编译”此搜索,但如果您只需要执行一次,请不要费心。

0

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

>>> import re
>>> string = "/foo13546897/bar/Atlantis-GPS-coordinates/bar457822368/foo/"
>>> re.search(r'(?<=/bar/)[^/]+(?=/)', string).group()
'Atlantis-GPS-coordinates'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接