Python 有没有一种有效的方法在两个字符串之间拆分字符串?

Python 有没有一种有效的方法在两个字符串之间拆分字符串?,python,string,algorithm,split,Python,String,Algorithm,Split,我正在尝试拆分一个字符串,以从该字符串中提取一些所需的字符串片段。我拥有的字符串如下所示: s='conf/icdcs/BarbaraGS86|conf/icdcs/ShethL86|conf/icde/BhargavaMRS89|conf/icde/BhargavaNS88|conf/icde/BhargavaR88|conf/icde/ElmagarmidH88|conf/infocom/BadalM84|conf/sigmod/Skeen81|conf/sosp/PresottoM83|c

我正在尝试拆分一个字符串,以从该字符串中提取一些所需的字符串片段。我拥有的字符串如下所示:

s='conf/icdcs/BarbaraGS86|conf/icdcs/ShethL86|conf/icde/BhargavaMRS89|conf/icde/BhargavaNS88|conf/icde/BhargavaR88|conf/icde/ElmagarmidH88|conf/infocom/BadalM84|conf/sigmod/Skeen81|conf/sosp/PresottoM83|conf/vldb/Gray81|journals/cacm/EswarranGLT76|journals/cacm/Lamport78|journals/computer/Alexandridis86|journals/computer/Goguen86|journals/computer/KartashevK86|journals/csur/BernsteinG81|journals/csur/DavidsonG85|journals/csur/Kohler81|journals/jacm/Papadimitriou79b|journals/tc/Avizinis76|journals/tc/Garcia-Molina82|journals/tocs/BirrelN84|journals/tocs/CheritonZ85|journals/tocs/Reed83|journals/tods/Herlihy87|journals/tods/KungR81|journals/tse/BhargavaR89|journals/tse/BlackHJLC87|journals/tse/Randell75|journals/tse/SkeenS83'
我想在两个正斜杠之间的'conf'后面提取子字符串

conf/icdcs/ShethL86
conf/icde/BhargavaMRS89
conf/icde/BhargavaNS88

因此,对于上述字符串,我要提取:

icdcs
icde
icde
我已经成功地编写了以下代码来提取所需的值:

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

start = 'conf/'
end = '/'
res=find_between(s,start,end)

但它只能提取一次。我希望能够提取字符串中的所有子字符串,最好是提取到列表中。

split()
是您的朋友。如果你知道你总是想得到在
conf/
之后的东西,那么就先把它分开

print(s.split('conf/'))
# ['', 'icdcs/BarbaraGS86|',
#  'icdcs/ShethL86|',
#  'icde/BhargavaMRS89|',
#  'icde/BhargavaNS88|',
#  'icde/BhargavaR88|',
#  'icde/ElmagarmidH88|',
#  'infocom/BadalM84|',
#  'sigmod/Skeen81|',
#  'sosp/PresottoM83|',
#  'vldb/Gray81|journals/cacm/EswarranGLT76|journals/cacm/Lamport78|journals/computer/Alexandridis86|journals/computer/Goguen86|journals/computer/KartashevK86|journals/csur/BernsteinG81|journals/csur/DavidsonG85|journals/csur/Kohler81|journals/jacm/Papadimitriou79b|journals/tc/Avizinis76|journals/tc/Garcia-Molina82|journals/tocs/BirrelN84|journals/tocs/CheritonZ85|journals/tocs/Reed83|journals/tods/Herlihy87|journals/tods/KungR81|journals/tse/BhargavaR89|journals/tse/BlackHJLC87|journals/tse/Randell75|journals/tse/SkeenS83']
然后,您可以在下一个
/
上拆分结果字符串,并获取每个项目的第一部分

confs = [i.split('/')[0] for i in s.split('conf/') if i.strip()]

print(confs)
# ['icdcs', 'icdcs', 'icde', 'icde', 'icde', 'icde', 'infocom', 'sigmod', 'sosp', 'vldb']
如果只需要唯一值,可以使用
set()
删除重复项

print(set(confs))
# {'vldb', 'sigmod', 'icdcs', 'sosp', 'icde', 'infocom'}

我看到一堆其他答案在
|
上分开,这很好,但这确实会在列表中创建更多的项来迭代,而不是根据您的输入进行迭代。在
conf/
上拆分可以保证每个项目都有一些有价值的东西。你只需要每一个的第一部分,你就可以开始了

使用正则表达式<代码>重新设置findall-->
lookback&Lookahead

Ex:

import re

s='conf/icdcs/BarbaraGS86|conf/icdcs/ShethL86|conf/icde/BhargavaMRS89|conf/icde/BhargavaNS88|conf/icde/BhargavaR88|conf/icde/ElmagarmidH88|conf/infocom/BadalM84|conf/sigmod/Skeen81|conf/sosp/PresottoM83|conf/vldb/Gray81|journals/cacm/EswarranGLT76|journals/cacm/Lamport78|journals/computer/Alexandridis86|journals/computer/Goguen86|journals/computer/KartashevK86|journals/csur/BernsteinG81|journals/csur/DavidsonG85|journals/csur/Kohler81|journals/jacm/Papadimitriou79b|journals/tc/Avizinis76|journals/tc/Garcia-Molina82|journals/tocs/BirrelN84|journals/tocs/CheritonZ85|journals/tocs/Reed83|journals/tods/Herlihy87|journals/tods/KungR81|journals/tse/BhargavaR89|journals/tse/BlackHJLC87|journals/tse/Randell75|journals/tse/SkeenS83'
start = 'conf/'
end = '/'

print(re.findall(r"(?<={}).*?(?={})".format(re.escape(start),re.escape(end)), s)) 
['icdcs', 'icdcs', 'icde', 'icde', 'icde', 'icde', 'infocom', 'sigmod', 'sosp', 'vldb']

只需使用
split

prefix = 'conf/'
substrings = [p.split('/')[1] for p in s.split('|') if p.startswith(prefix)]
print(substrings)

您的答案只提取一次,因为您仅从
拆分(开始)
中选择第一个结果:

s.split(开始)
“ICDC/BhargavaMRS8 9 124“,“ICDC/巴巴巴巴AgS8 6 124?”,“ICDC/BharGaVaMRS8 9 124;”,“ICDC/巴巴巴巴AgS8 8 124;”,“ICDC/巴巴巴巴巴巴AgS8 6 6 124;,“ICDC/巴巴巴巴巴巴巴拉AgS8 6 124;”,,,“IC德/巴RGRGRG瓦瓦瓦瓦瓦瓦SS8 8 124;”,,,,“ICDC/ICDC/ICDC/巴巴巴巴巴巴巴巴巴巴巴RGS8 18 18 18 18 18 18 124?”,,,,,,,,,,,,,,,,,,,,,,,,,,“ICDC/ICDC/ICDC/巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴AgAgAgAgAg/计算机/卡尔塔舍夫克86 | journals/csur/BernsteinG81 | journals/csur/DavidsonG85 | journals/csur/Kohler81 | journals/jacm/papapadimitriou79b | journals/tc/Avizinis76 | journals/tc/Garcia-Molina82 | journals/tocs/birrlen84 | journals/tocs/CheritonZ85 | journals/tocs/Reed83 | journals/tods/Herlihy87 | journals/tods/kungrs/kungrs/KungR81 | vartse/blacktse/blacktse/black5 |期刊/tse/SkeenS83']
通过选择just
split(start)[1]
,您只能得到“icdcs/BarbaraGS86”。所以你知道你的最终逻辑是正确的,你只想能够挑出所有其他的结果。列表理解应该非常有效:

[x.split(end)[0]用于s.split(start)中的x如果x]
这将迭代所有结果。然而,问题是,在最后仍然有很多跟踪结果,其中没有
conf
。你可以跳过像这样的列表片段

#-2将抓取除最后一个结果之外的所有内容
s、 拆分('\conf')[:-2]
或者你也可以忽略它们,比如:

[x代表s.split(“|”)中的x,如果x.startswith('conf/”)
我认为后者更健壮,可读性更强,因为对于这种逻辑的一般应用,我不能保证坏结果的位置,切片可以删除您真正想要的东西

总的来说,您的函数可以如下所示:

def find_介于(s,start,end)之间:
对于s.split(“|”)中的x:
如果x.startswith(开始):
#这里的yield将允许您进行迭代
#超越功能
收益率x.split(开始)[1]。split(结束)[0]
s='conf/icdcs/BarbaraGS86 | conf/icdcs/ShethL86 | conf/icde/BhargavaMRS89 | conf/icde/BhargavaNS88 | conf/icde/ElmagarmidH88 | conf/infocom/BadalM84 | conf/sigmod/Skeen81 | conf/sosp/PresottoM83 | conf/vldb/Gray81 | journals/cacm/eswarrangl76 12478 | journals/calm/cagm/cagm/KartashevK86 | journals/csur/BernsteinG81 | journals/csur/DavidsonG85 | journals/csur/Kohler81 | journals/jacm/Papadimitriou79b | journals/tc/Avizinis76 | journals/tc/Garcia-Molina82 | journals/tocs/BirrelN84 | journals/tocs/CheritonZ85 | journals/tocs/Reed83 | journals/tods/Herlihy87 12481 | journals/Blackgrkuntse/Bhargate 12487 | Vargsat |se/Randell75 |期刊/tse/SkeenS83'
start='conf/'
结束='/'
a=[x代表在(s,开始,结束)之间的find_中的x]
#['ICDC','ICDC','icde','icde','icde','infocom','sigmod','sosp','vldb']

您可能需要查看
re
模块。在执行此操作之前,您是否使用“|”分隔文本?解释此正则表达式的工作原理以及
re.escape
可能会有所帮助,因为与其他答案相比,这是一个相当复杂的实现