我如何找到两个子字符串('123STRINGabc' -> '字符串')之间的字符串?

我现在的方法是这样的:

>>> start = 'asdf=5;'
>>> end = '123jasd'
>>> s = 'asdf=5;iwantthis123jasd'
>>> print((s.split(start))[1].split(end)[0])
iwantthis

然而,这似乎非常低效且不符合python规则。有什么更好的方法来做这样的事情吗?

忘了说: 字符串可能不是以start和end开始和结束的。他们可能会有更多的字符之前和之后。


当前回答

import re

s = 'asdf=5;iwantthis123jasd'
result = re.search('asdf=5;(.*)123jasd', s)
print(result.group(1))

其他回答

字符串格式为Nikolaus Gradwohl的建议增加了一些灵活性。开始和结束现在可以根据需要进行修改。

import re

s = 'asdf=5;iwantthis123jasd'
start = 'asdf=5;'
end = '123jasd'

result = re.search('%s(.*)%s' % (start, end), s).group(1)
print(result)
import re

s = 'asdf=5;iwantthis123jasd'
result = re.search('asdf=5;(.*)123jasd', s)
print(result.group(1))

只是把OP自己的解决方案转换成一个答案:

def find_between(s, start, end):
    return (s.split(start))[1].split(end)[0]

使用来自不同电子邮件平台的分隔符解析文本带来了这个问题的更大版本。它们通常有一个开始和一个停止。通配符的分隔符字符不断阻塞正则表达式。这里和其他地方都提到了分割的问题——哎呀,分隔符不见了。我突然想到使用replace()来让split()使用其他东西。代码块:

nuke = '~~~'
start = '|*'
stop = '*|'
julien = (textIn.replace(start,nuke + start).replace(stop,stop + nuke).split(nuke))
keep = [chunk for chunk in julien if start in chunk and stop in chunk]
logging.info('keep: %s',keep)
s[len(start):-len(end)]