我正在尝试分割字符串以从该字符串内部提取一些所需的字符串。我的字符串如下所示:
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)
但是它只能提取一次。我希望能够提取字符串中的所有子字符串,最好提取到列表中。
答案 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]