1

複雑な文字列があり、そこから複数の部分文字列を抽出したいと考えています。

文字列は、コンマで区切られた一連の項目で構成されます。各項目には、括弧で囲まれた単語のペアの識別子 (id-n) があります。末尾に数字が付いている括弧内の単語のみを取得したい (例: 「This-1」)。番号は、実際には、抽出後に単語をどのように配置するかの位置を示しています。

#Example of how the individual items would look like
id1(attr1, is-2) #The number 2 here indicates word 'is' should be in position 2
id2(attr2, This-1) #The number 1 here indicates word 'This' should be in position 1
id3(attr3, an-3) #The number 3 here indicates word 'an' should be in position 3
id4(attr4, example-4) #The number 4 here indicates word 'example' should be in position 4
id5(attr5, example-4) #This is a duplicate of the word 'example'

#Example of string - this is how the string with the items looks like
string = "id1(attr1, is-1), id2(attr2, This-2), id3(attr3, an-3), id4(attr4, example-4), id5(atttr5, example-4)"

#This is how the result should look after extraction
result = 'This is an example'

これを行う簡単な方法はありますか?正規表現は私には機能しません。

4

3 に答える 3

2

些細な/素朴なアプローチ:

>>> z = [x.split(',')[1].strip().strip(')') for x in s.split('),')]
>>> d = defaultdict(list)
>>> for i in z:
...    b = i.split('-')
...    d[b[1]].append(b[0])
...
>>> ' '.join(' '.join(d[t]) for t in sorted(d.keys(), key=int))
'is This an example example'

exampleサンプル文字列で の位置が重複しているためexample、コードで が繰り返されています。

ただし、サンプルも要件に一致していませんが、この結果は説明どおりです。位置インジケーターに従って配置された単語。

ここで、重複を取り除きたい場合:

>>> ' '.join(e for t in sorted(d.keys(), key=int) for e in set(d[t]))
'is This an example'
于 2013-06-12T04:35:06.263 に答える
2

なぜ正規表現ではないのですか?これは機能します。

In [44]: s = "id1(attr1, is-2), id2(attr2, This-1), id3(attr3, an-3), id4(attr4, example-4), id5(atttr5, example-4)"

In [45]: z = [(m.group(2), m.group(1)) for m in re.finditer(r'(\w+)-(\d+)\)', s)]

In [46]: [x for y, x in sorted(set(z))]
Out[46]: ['This', 'is', 'an', 'example']
于 2013-06-12T04:29:52.357 に答える