1

次のような文字列があります。

str = "something move 11 something move 12 something 13 copy 14 15"

ここで、「何か」は何らかのテキストを意味するか、テキストをまったく意味しません。
その結果、次のようなリストが必要です。

[('move', 11, ''), ('move', 12, 13), ('copy', 14, 15)]

私はこれを使ってみました:

re.findall('(move|copy).+?([0-9]+).+?([0-9]+)*', str)

しかし、それは私の出力を与えます:

[('move', 11, ''), ('move', 12, ''), ('copy', 14, '')]

最後の番号がオプションであるためだと理解していますが、どうすれば機能するのかわかりません。

これどうやってするの?

4

2 に答える 2

1

正規表現を使用できます(後読みと先読みを使用):

In [1]: import re

In [2]: tokens = "something move 11 something move 12 something 13 copy 14 15"

In [3]: split_movements = re.split('(?<=\d)\s(?!\d+)', tokens)

In [4]: split_movements
Out[4]: ['something move 11', 'something move 12', 'something 13', 'copy 14 15']

In [5]: movements = [re.split('\s(?=\d+)', m) for m in split_movements]

In [6]: movements
Out[6]: 
[['something move', '11'],
 ['something move', '12'],
 ['something', '13'],
 ['copy', '14', '15']]
于 2013-01-23T21:34:57.910 に答える
1

@Ashwini Chaudharyの回答に基づく:

#!/usr/bin/env python
import re

commands = "copy move".split()
input_string  = "something move 11 something move 12 something 13 copy 14 15"
tokens = iter(re.split("(%s)" % "|".join(map(re.escape, commands)), input_string))
result = []
for tok in tokens:
     if tok in commands:
        args = re.findall(r"\d+", next(tokens, ""))
        result.append((tok,) + tuple(args) + ("",)*(2 - len(args)))
print(result)

出力

[('move', '11', ''), ('move', '12', '13'), ('copy', '14', '15')]

各コマンドを 2 つの引数に制限するには、単に slicing: を使用しますtuple(arg[:2])

于 2013-01-23T21:41:12.053 に答える