0

我在尝试将字符串解析为两个字段时遇到了一些逻辑问题。名称和版本。我一直在拆分“/”,它对于其中只有一个“/”的字符串非常有效。例如:

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//]”),这样我就可以索引字符串的第一个和最后一个字符。对此的任何帮助将不胜感激。谢谢

4

4 回答 4

1

根据 BrenBarn 和 sr2222 的一些有用评论,我建议以下解决方案。

OP应该要么

  • 确保版本字符串不包含任何 '/' 字符,然后rsplit按照 sr2222 的建议使用

或者

  • 为名称版本划分选择不同的分隔符

忽略最后一个字符(以便可以将其分配给ver变量)的解决方案将是

ind = Part[:-1].rindex('/')
name = Part[:ind+1]
ver = Part[ind+1:]

在 OPs 输入上,这会产生所需的输出。

于 2012-07-25T21:35:37.677 回答
1

如果分隔符的任何实例可能正在执行分隔,则选择太多。以你的最后一个例子,some/name//. 三个斜线中的哪一个是分隔符?字符串可以按顺序解析为 as ("some", "name//")、 as("some/name", "/")或 as ("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/')

简而言之,它在后面有东西的最后一个斜杠上分裂(可能是最后一个斜杠)。如果您不喜欢这种方法,则需要提供有关您的想法的更多详细信息。

于 2012-07-25T23:36:47.523 回答
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(']') 
于 2012-07-26T14:04:45.443 回答
0

对于您发布的案例,这将起作用:

if part.endswith('//'):
    name, ver = part[:-2], '/’
else:
    name, ver = part.rsplit(’/’, 2)
于 2012-07-25T22:21:06.333 回答