是否有一种在两个字符串之间分割字符串的有效方法?

时间:2019-05-03 13:18:07

标签: 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|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)

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

5 个答案:

答案 0 :(得分:2)

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/上进行拆分可确保每个项目都具有一定的价值。您只需参加每个课程的第一部分,就可以继续进行。

答案 1 :(得分:0)

使用正则表达式。 re.findall-> Lookbehind & Lookahead

例如:

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']

答案 2 :(得分:0)

您可以将列表理解与str.split结合使用。

>>> [z.split('/')[1] for z in s.split('|') z.startswith('conf/')]
['icdcs', 'icdcs', 'icde', 'icde', 'icde', 'icde', 'infocom', 'sigmod', 'sosp', 'vldb']

由于列表包含重复项,因此您可能希望将其删除。为此,您可以使用set(设置理解力):

>>> {z.split('/')[1] for z in s.split('|') if z.startswith('conf/')}
{'icde', 'vldb', 'sigmod', 'icdcs', 'infocom', 'sosp'}

答案 3 :(得分:0)

只需使用split

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

答案 4 :(得分:0)

您的答案仅提取一次,因为您只是从NULL中选择第一个结果:

NULL

仅选择split(start),只会得到''icdcs / BarbaraGS86 |'。因此,您知道您的最终逻辑是正确的,您只希望能够挑选出所有其余结果。列表理解应该可以很好地工作:

s.split(start)
['', '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']

这将遍历您的所有结果。但是,问题在于,最后您仍然有很多跟踪结果,而没有中没有split(start)[1]。您可以跳过带有列表切片的内容,例如

[x.split(end)[0] for x in s.split(start) if x]

或者您可以在物理上忽略它们,例如:

conf

我认为后者更具鲁棒性和可读性,因为对于这种逻辑的一般应用,我无法保证不良结果的位置,并且切片可以删除您真正想要的东西。

因此,总的来说,您的函数可能类似于:

# -2 will grab everything except the last result
s.split('\conf')[:-2]
相关问题