2012-07-25 97 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(']')