2

このリストを考えると:

['MIA', 'BOS', '08:17 AM', '-107', '-103', '08:17 AM', '+1 -111', '-1 +103', u'91', u'93']

次の結果のスペースで を分割し+1 -111たい:-1 +103

['MIA', 'BOS', '08:17 AM', '-107', '-103', '08:17 AM', '+1', '-111', '-1', '+103', u'91', u'93']

これは私が必要とする正規表現です:

(?<=\d)\s(?=[-+]\d\d\d)

しかし、どうやらそれをリストに適用する方法がわかりません。明らかに、常にnthリストの要素を分割するなど、スライスを使用したソリューションは歓迎されません。私はこれがより効率的であることを好みます。

4

4 に答える 4

2

既存のreものを使用すると、次を使用して単一要素の分割を平坦化できます。

import re
from itertools import chain

some_list = ['MIA', 'BOS', '08:17 AM', '-107', '-103', '08:17 AM', '+1 -111', '-1 +103', u'91', u'93']
print list(chain.from_iterable(re.split('(?<=\d)\s(?=[-+]\d\d\d)', s) for s in some_list))
# ['MIA', 'BOS', '08:17 AM', '-107', '-103', '08:17 AM', '+1', '-111', '-1', '+103', u'91', u'93']
于 2013-06-24T22:23:59.010 に答える
1

ジェネレーターを使用すると、特に巨大な入力の場合に非常に効率的であり、反復処理後に結果を破棄する場合 (中間リストを使用するよりもエレガントです):

def split_elements(list_, regex):
    for element in list_:
        for sub_element in re.split(regex, element):
            yield sub_element

output = [x for x in split_elements(input, regex)]

サンプル入力の場合:

>>> l = ['MIA', 'BOS', '08:17 AM', '-107', '-103', '08:17 AM', 
         '+1 -111', '-1 +103', u'91', u'93']

>>> list(split_elements(l, r'(?<=\d)\s(?=[-+]\d\d\d)'))
['MIA', 'BOS', '08:17 AM', '-107', '-103', '08:17 AM', '+1', '-111', '-1',
 '+103', u'91', u'93']

これは、Jon Clements の回答で使用されている手法とほぼ同じですが、itertools は使用されていません (ワンライナーは数週間後に読みにくくなる可能性があります)。

于 2013-06-24T22:25:28.783 に答える
1

これが最も効率的な方法かどうかはわかりませんが、次のとおりです。

output = []
for x in input:
    if re.search('(?<=\d)\s(?=[-+]\d\d\d)', x):
        output += x.split(" ")

動作するはずです。

于 2013-06-24T22:22:55.840 に答える
1

リスト内包表記を使用したオプションの 1 つを次に示します。

import re

lst = ['MIA', 'BOS', '08:17 AM', '-107', '-103', '08:17 AM', '+1 -111', '-1 +103', u'91', u'93']
result = [s for x in lst for s in re.split(r'(?<=\d)\s(?=[-+]\d\d\d)', x)]

結果:

>>> result
['MIA', 'BOS', '08:17 AM', '-107', '-103', '08:17 AM', '+1', '-111', '-1', '+103', u'91', u'93']

または、その場でリストを変更するには:

for i in range(len(lst)-1, -1, -1):
    lst[i:i+1] = re.split(r'(?<=\d)\s(?=[-+]\d\d\d)', lst[i])

ここでは、リストの末尾から先頭へのループが重要であることに注意してください。

于 2013-06-24T22:25:02.437 に答える