0

文字列を 2 つのフィールドに解析しようとすると、論理的な問題が発生します。名前とバージョン。私は "/" で分割してきましたが、"/" が 1 つしかない文字列に対しては非常にうまく機能します。例えば:

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

セパレーターのインスタンスが分離を行っている可能性がある場合、選択肢が多すぎます。最後の例を見てくださいsome/name//。3 つのスラッシュのうち、区切り記号はどれですか? ("some", "name//")文字列は、 as 、 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 に答える
1

BrenBarn と sr2222 による有益なコメントに続いて、次の解決策を提案します。

OPは次のいずれかでなければなりません

  • バージョン文字列に「/」文字が含まれていないことを確認してからrsplit、sr2222 の提案に従って使用してください

また

  • name-version 部門には別の区切り文字を選択してください

ver最後の文字を無視する (変数に割り当てることができるように) ソリューションは次のようになります。

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

OP 入力では、これにより目的の出力が生成されます。

于 2012-07-25T21:35:37.677 に答える
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 に答える