1

それ自体がリストである多くのエントリを含むリストがあります。メイン リスト内のサブリストの一部を次に示します。

>>> data[4]
['', u'BNE JCT TR92 FLO GRJCT-PERRY-BITTERSWEET', u'BNE_JCT TR92 TR92 (XF/ALTW/*)', u'KARMA-PERRY-BITTERSWEET_161', u' 01', -15.88, '']
>>> data[5]
['', u'CRETE-STJHN FLO DMNT-WLTN 765+SPS', u'ST_JOHN 34519 A (LN/NIPS/CE)', u'SPS WILTON-DUMONT+PWRTN 5+JOLIET 7', u' 01', -8.14, '']
>>> data[6]
['', u'HRNR_TR_1_TR_1_XF', u'HRNR TR_1 TR_1 (XF/AMMO/*)', '', u' 01', 1.4, '']
>>> data[7]
['', u'INDPDN  INDPDBRYAN69_11 LN', u'INDPDN INDPDBRYAN69_1 1 (LN/ALTW/ALTW)', u'ACTUAL', u' 01', 1.26, '']
>>>

次のように、サブリストの列 3 を 4 つのコンポーネントに分割します。

  • 最初の文字から最後の非スペース文字までのすべての文字列
  • (と の間にカプセル化された文字列/
  • /と の間にカプセル化された文字列/
  • /と の間にカプセル化された文字列)

したがって、同じリストが必要ですが、上記のように列 3 が 4 列に分割されています。

例:

['', u'BNE JCT TR92 FLO GRJCT-PERRY-BITTERSWEET', u'BNE_JCT TR92 TR92', u'XF',u'ALTW','*', u'KARMA-PERRY-BITTERSWEET_161', u' 01', -15.88, '']

また、要素の前にある が何uを表しているのかもわかりません。私はいじっていましre.split()たが、元のリストを保持するが、サブリストの列3を4つの追加列に分割するこれを機能させることができませんでした。

助けてくれてありがとう。

[arraylist を削除して list に置き換える編集を行いました]**

4

3 に答える 3

3

必要な文字列の部分に一致する正規表現パターンを次に示します。

pattern = r"(.+) \((.+)/(.+)/(.+)\)"

これはおそらく、仕事をする最も単純な正規表現です。

使用方法は次のとおりです。

import re

for row in data:
    row[2:3] = re.match(pattern, row[2]).groups()

そこには多くのことが起こっています。外側のループは非常に簡単に理解できます。内側のパーツには 2 つのパーツ セクションがあります。

  1. re.match(pattern, row[2]).groups()正規表現マッチングを行い、見つかった値のタプルを返します (例: ('BNE_JCT TR92 TR92', 'XF', 'ALTW', '*'))。
  2. 2 番目のビットはスライスの割り当てです。row[slice] = some_sequence指定されたスライスを の値で置き換えますsome_sequence。シーケンス内の値の数がスライス内とは異なる場合、リストのサイズが変わります! この場合、単一値のスライス (インデックス 2 で開始し、インデックス 3 の前で停止) を、正規表現の一致から取得した 4 つの値に置き換えます。

正規表現がどの行の値とも一致しない場合、このコードは例外を発生させることに注意してください。データが「乱雑」になる可能性がある場合は、データを爆発させるのではなく、これを検出するロジックを追加する必要があります。

于 2013-03-18T22:18:20.360 に答える
2

u前面のはユニコードを表し、文字列にユニコード文字を含めることができます。これは、Python 3.0以降以外のバージョンで使用されます(デフォルトでは、Python 3.0以降はユニコードです)。

分割については、次のようにして、必要な列に分割できます。

# search for parts you need in column 3
for subitem in re.findall("(.*?) \((.*?)\)", item[2]):
    temp_split = [subitem[0]]
    temp_split.extend(subitem[1].split("/"))

リストの途中に列を追加することはできません。
次のように新しいリストを作成できます。

for item_index in range(len(data)):
    item = data[item_index]

    for subitem in re.findall("(.*?) \((.*?)\)", item[2]):
        # part before the ( )
        temp_split = [subitem[0]]
        # part in the ( )
        temp_split.extend(subitem[1].split("/"))

    temp_item = item[:2]
    temp_item.extend(temp_split)
    temp_item.extend(item[3:])

    data[item_index] = temp_item
于 2013-03-18T22:17:10.623 に答える
0
import re
data = ['', u'BNE JCT TR92 FLO GRJCT-PERRY-BITTERSWEET', u'BNE_JCT TR92 TR92 (XF/ALTW/*)', u'KARMA-PERRY-BITTERSWEET_161', u' 01', -15.88, '']
_data =[]
tempStr = ""
for i in data:
    if re.match("(.+/.+/.+)", str(i)):
        for char in i:
            if (char != "(" and char != "/" and char != ")"):
                tempStr += char
            else:
                _data.append(tempStr)
                tempStr = ""
    else:
        _data.append(i)
print _data

このスクリプトは次の出力を提供します:

['', u'BNE JCT TR92 FLO GRJCT-PERRY-BITTERSWEET', u'BNE_JCT TR92 TR92 ', u'XF', u'ALTW', u'*', u'KARMA-PERRY-BITTERSWEET_161', u' 01', -15.88, '']
于 2013-03-18T22:17:30.327 に答える