3

このリストに従って、文字列からいくつかのデータを抽出する方法を見つけようとしています:

check_list = ['E1', 'E2', 'E7', 'E3', 'E9', 'E10', 'E12', 'IN1', 'IN2', 'IN4', 'IN10']

たとえば、このリストの場合:

s1 = "apto E1-E10 tower 1-2 sanit"

私は得るだろう['E1', 'E10']

s2 = "apto IN2-IN1-IN4-E12-IN10 mamp"

このために私は得るでしょう:['IN2', 'IN1', 'IN4', 'E12', 'IN10']

そして、これはトリッキーになります:

s3 = "E-2-7-3-9-12; IN1-4-10 T 1-2 inst. hidr."

私は得るでしょう:['E2', 'E7', 'E3', 'E9', 'E12', 'IN1', 'IN4', 'IN10']

これを解決するためのアドバイスをお願いできますか?

4

4 に答える 4

3

以下が機能するはずです。

def extract_data(s):
    check_set = set(['E1', 'E2', 'E7', 'E3', 'E9', 'E10', 'E12',
                     'IN1', 'IN2', 'IN4', 'IN10'])
    result = []
    for match in re.finditer(r'\b(E|IN)[-\d]+', s):
        for digits in re.findall(r'\d+', match.group(0)):
            item = match.group(1) + digits
            if item in check_set:
                result.append(item)
    return result

例:

>>> extract_data("apto E1-E10 tower 1-2 sanit")
['E1', 'E10']
>>> extract_data("apto IN2-IN1-IN4-E12-IN10 mamp")
['IN2', 'IN1', 'IN4', 'E12', 'IN10']
>>> extract_data("E-2-7-3-9-12; IN1-4-10 T 1-2 inst. hidr.")
['E2', 'E7', 'E3', 'E9', 'E12', 'IN1', 'IN4', 'IN10']
于 2012-06-14T22:30:12.723 に答える
1
import re

def parse(string):
  result = []
  for match in re.findall('(E|IN)-{0,1}([\d]+)((-[\d]+)*)', string):
    letter = match[0]
    numbers = [int(i) for i in [match[1]] + match[2].split('-')[1:]]
    for number in numbers:
      result.append('%s%d' % (letter, number))

  return result


print parse('apto E1-E10 tower 1-2 sanit')
print parse('apto IN2-IN1-IN4-E12-IN10 mamp')
print parse('E-2-7-3-9-12; IN1-4-10 T 1-2 inst. hidr.')
于 2012-06-14T22:31:29.930 に答える
0

私はこれをできるだけ一般的にしようとしました:

import re

def make_relist(l):
    relist = []
    for a in l:
        alpha, num = re.match('([a-zA-Z]+)(\d+)', a).groups()
        re_string = r'\b{0}({1}|\d*-(\d+-)*{1})\b'.format(alpha, num)
        relist.append((a, re.compile(re_string)))

    return relist

def extract(s, relist):
   return [v for v, r in relist if r.search(s)]

テスト:

>>> tokens = ['E1', 'E2', 'E7', 'E3', 'E9', 'E10', 'E12', 'IN1', 'IN2', 'IN4', 'IN10']
>>> relist = make_relist(tokens)
>>> extract("apto E1-E10 tower 1-2 sanit", relist)
['E1', 'E10']
>>> extract("apto IN2-IN1-IN4-E12-IN10 mamp", relist)
['E12', 'IN1', 'IN2', 'IN4', 'IN10']
>>> extract("E-2-7-3-9-12; IN1-4-10 T 1-2 inst. hidr.", relist)
['E2', 'E7', 'E3', 'E9', 'E12', 'IN1', 'IN4', 'IN10']

抽出する文字列が多数ある場合は、コンパイルのオーバーヘッド時間が重要ではなくなるため、これがより効率的になることに注意してください。

于 2012-06-15T00:20:09.197 に答える
0

これは部分的な回答であり、問​​題の解決方法を示すものです。

「キー」INとを使用してE、キーとそれに続く任意の数のスペースまたはダッシュに一致するパターンを文字列から検索します。

例えば:

import re

S = ['apto E1-E10 tower 1-2 sanit','apto IN2-IN1-IN4-E12-IN10 mamp','E-2-7-3-9-12; IN1-4-10 T 1-2 inst. hidr.']

for s in S:
    print s
    M = re.findall(r'(IN[\d\-]*)', s)
    for m in M: print m

    M = re.findall(r'(E[\d\-]*)', s)
    for m in M: print m

プロデュース:

$ python 抽出.py
アプト E1-E10 タワー 1-2 サニト
E1-
E10
アプト IN2-IN1-IN4-E12-IN10 マンプ
IN2-
1で-
IN4-
IN10
E12-
E-2-7-3-9-12; IN1-4-10 T 1-2 インスト。ヒド。
IN1-4-10
E-2-7-3-9-12

次に、それぞれmを取得してさらに解析します。そのE1-結果、結果は に[E1]なりE-2-7-3-9-12ました[E2,E7,E3,E9,E12]

于 2012-06-14T22:33:14.703 に答える