簡體   English   中英

如何在字符串內多次出現的字符上拆分字符串

[英]How to split a string on a character that occurs more than once inside the string

我試圖將字符串解析為兩個字段時遇到一些邏輯問題。 名稱和版本。 我一直在分裂“/”,它對於只有一個“/”的字符串非常有效。 例如:

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 //]”),因此我可以索引字符串的第一個和最后一個字符。 非常感謝任何幫助。 謝謝

根據BrenBarn和sr2222的一些有用的評論,我建議以下解決方案。

OP應該是

  • 確保版本字符串不包含任何“/”字符,然后rsplit的建議使用rsplit

要么

  • 為名稱 - 版本划分選擇不同的分隔符

忽略最后一個字符的解決方案(這樣可以將其分配給ver變量)將是

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

在OPs輸入上,這會產生所需的輸出。

如果分隔符的任何實例可能正在進行分離,則選擇太多。 拿你的最后一個例子, some/name// 三個斜線中的哪一個是分隔符? 該字符串可以按順序解析為("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/')

簡而言之,它會在最后的斜杠上分裂,后面有一些東西 (可能是最后的斜杠)。 如果您不喜歡這種方法,則需要提供有關您的想法的更多詳細信息。

對於您發布的案例,這可行:

if part.endswith('//'):
    name, ver = part[:-2], '/’
else:
    name, ver = part.rsplit(’/’, 2)

這是我制作的代碼,幾乎可以處理每個案例。 它沒有處理的唯一情況是名稱和版本不明確,你無法判斷“/”是否是名稱或版本的一部分。 謝謝大家的意見。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM