2012-07-25 157 views
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

不会有任何通用的方法来解析包含'/'的字符串,它们也被'/'分开。你需要有更多的信息。比如,你怎么知道哪个'/'应该是分隔符,哪些是名字的一部分? – BrenBarn 2012-07-25 21:31:29

+0

在第一行代码中,应该引用该字符串。此外,Part的预期输出应该是'ver = /',而不是'ver = \',因为反斜杠不会出现在第一个字符串中。 – Lenna 2012-07-25 21:35:53

+0

我错过了问题的第二部分,并同意@BrenBarn - 它太含糊。我建议OP提供一个唯一的字符串来从版本中分隔名称。 – jmetz 2012-07-25 21:40:36

回答

1

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

的OP要么

  • 确保版本字符串不包含任何 '/' 字符,然后用rsplit通过sr2222

    的建议
  • 为名称版本分区选择不同的分隔符

忽略最后一个字符(例如,它可以被分配给ver变量)中的溶液。将

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

在OP的输入,这产生所需的输出。

+1

或者只是使用'rsplit'或'rpartition'。 – 2012-07-25 21:36:16

+1

如果它始终是最后一个将版本与版本分开的'/',则可以使用,但如果是这种情况,则从OP的描述中不清楚。 – BrenBarn 2012-07-25 21:38:11

+0

Ahh哎呀,你是@ sr2222 - 你应该作为一个单独的答案发布,并已接受。 – jmetz 2012-07-25 21:38:18

0

为您发布的情况下,这会工作:

if part.endswith('//'): 
    name, ver = part[:-2], '/’ 
else: 
    name, ver = part.rsplit(’/’, 2) 
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/') 

总之,它分裂在具有东西后(可能是最后的斜杠)最后一个斜线。如果你不喜欢这种方法,你需要提供更多关于你想到的细节。

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