我有一些逻辑问题试图将字符串解析为两个字段。名称和版本。我一直在分裂“/”,它对于只有一个“/”的字符串非常有效。例如:
strString = someName/A
nameVer = strString .split('/')
name = nameVer[0]
ver = nameVer[1]
这会返回name = someName和ver = A.这就是我想要的。问题是当我在字符串中有多个“/”时。特别是这3例:
Part ="someName//" #Expected output: name=someName ver=\
Part1="some/Name/A" #Expected output:name=some/Name ver=A
Part2="some/Name//" #Expected output:name=some/Name ver=/
名称和版本都可以是或包含“/”。我已经尝试了很多东西,包括跟踪“/”的索引,并抓住它们之间的什么。在某些情况下,我还在字符串中添加了括号(“[some / Name //]”),因此我可以索引字符串的第一个和最后一个字符。非常感谢任何帮助。感谢
答案 0 :(得分:1)
根据BrenBarn和sr2222的一些有用评论,我建议采用以下解决方案。
OP应该
rsplit
或强>
忽略最后一个字符的解决方案(可以将其分配给ver
变量)将是
ind = Part[:-1].rindex('/')
name = Part[:ind+1]
ver = Part[ind+1:]
在OPs输入上,这会产生所需的输出。
答案 1 :(得分:1)
如果分隔符的任何实例可能正在进行分隔,则选择太多。以你的最后一个例子some/name//
为例。三个斜线中的哪一个是
分隔器?该字符串可以按顺序解析为("some", "name//")
,
作为("some/name", "/")
或("some/name/", "")
。
怎么办?假设版本必须非空(排除选项3),
否则名称部分应该是最大的。如果你喜欢这些规则,
这是一个可以完成工作的正则表达式:r'^(.*)/(.+)$'
。您可以像这样使用它:
name, ver = re.match(r'^(.*)/(.+)$', "some/name/").groups()
以下是它的作用:
>>> re.match(r'^(.*)/(.+)$', "name//").groups()
('name', '/')
>>> re.match(r'^(.*)/(.+)$', "some/name/a").groups()
('some/name', 'a')
>>> re.match(r'^(.*)/(.+)$', "some/name//").groups()
('some/name', '/')
>>> re.match(r'^(.*)/(.+)$', "some/name/").groups()
('some', 'name/')
简而言之,它会在最后一个之后的斜杠上分割(可能是最后的斜杠)。如果您不喜欢这种方法,则需要提供有关您的想法的更多详细信息。
答案 2 :(得分:0)
对于您发布的案例,这可行:
if part.endswith('//'):
name, ver = part[:-2], '/’
else:
name, ver = part.rsplit(’/’, 2)
答案 3 :(得分:0)
这是我制作的几乎可以处理每个案例的代码。它没有处理的唯一情况是名称和版本不明确,你无法判断“/”是否是名称或版本的一部分。谢谢大家的意见。
Part ="[0717_PFM1//]"
Part1="[0717_PFM1/A]" #generic case
Part2="[0717/_PFM1/A]"
Part3="[07/17/_PFM1//]" #Test case below
#Part3="[0717/_PFM1//B]" #Not working, ambigous: cant tell if the ending slash is part of name or ver
import re
lastCharIndex = Part3.index(']')
list1 =[]
counter = 0
numberOfSlashes = Part3.count("/")
if numberOfSlashes > 1:
nameVer = Part3.split("/")
name1, ver1 = re.match(r'^(.*)/(.+)$', Part3).groups()
if nameVer[2].strip("]") or ver1.strip("]") == "":
ver = "/"
else:
ver = nameVer[2].strip("]")
name = nameVer[0].strip('[')
if len(name1)>len(name):
name = name1
if len(ver1) > len(ver):
ver = ver1
name = name.rstrip("/")
else:
nameVer = Part3.split("/")
name, ver = nameVer[0], nameVer[1]
print "name",name.strip('['), "ver",ver.strip(']')