如何在字符串中出现多次的字符上分割字符串
我遇到了一些尝试将字符串解析为两个字段的逻辑问题。名称和版本。我一直在分割“/”,它对于只有一个“/”的字符串非常适用。例如:如何在字符串中出现多次的字符上分割字符串
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
通过sr2222
或
-
的建议
- 为名称版本分区选择不同的分隔符
忽略最后一个字符(例如,它可以被分配给ver
变量)中的溶液。将
ind = Part[:-1].rindex('/')
name = Part[:ind+1]
ver = Part[ind+1:]
在OP的输入,这产生所需的输出。
为您发布的情况下,这会工作:
if part.endswith('//'):
name, ver = part[:-2], '/’
else:
name, ver = part.rsplit(’/’, 2)
如果分离的任何实例可能会做分离,有太多的选择。拿你最后一个例子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/')
总之,它分裂在具有东西后(可能是最后的斜杠)最后一个斜线。如果你不喜欢这种方法,你需要提供更多关于你想到的细节。
这是我所做的代码,几乎可以处理每种情况。唯一不能处理的情况是名称和版本不明确,而且不能确定“/”是否与名称或版本不同。感谢大家的意见。
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(']')
不会有任何通用的方法来解析包含'/'的字符串,它们也被'/'分开。你需要有更多的信息。比如,你怎么知道哪个'/'应该是分隔符,哪些是名字的一部分? – BrenBarn 2012-07-25 21:31:29
在第一行代码中,应该引用该字符串。此外,Part的预期输出应该是'ver = /',而不是'ver = \',因为反斜杠不会出现在第一个字符串中。 – Lenna 2012-07-25 21:35:53
我错过了问题的第二部分,并同意@BrenBarn - 它太含糊。我建议OP提供一个唯一的字符串来从版本中分隔名称。 – jmetz 2012-07-25 21:40:36