3

CPV (共通調達語彙) コードのかなり長い文字列を検索する必要があります。

現時点では、単純な for ループと str.find() でこれを行っています

問題は、CPV コードがわずかに異なる形式でリストされている場合、このアルゴリズムはそれを見つけられないことです。

文字列内のコードのさまざまな繰り返しをすべて検索する最も効率的な方法は何ですか? 最大 10,000 個の CPV コードをそれぞれ再フォーマットし、各インスタンスに str.find() を使用するだけですか?

異なるフォーマットの例は次のとおりです。

30124120-1 
301241201 
30124120 - 1
30124120 1
30124120.1

ありがとう :)

4

3 に答える 3

4

正規表現を試してください:

>>> cpv = re.compile(r'([0-9]+[-\. ]?[0-9])')
>>> print cpv.findall('foo 30124120-1 bar 21966823.1 baz')
['30124120-1', '21966823.1']

(データの CPV と厳密に一致するように変更してください。)

于 2011-01-12T19:09:59.253 に答える
1
cpv = re.compile(r'(\d{8})(?:[ -.\t/\\]*)(\d{1}\b)')

for m in re.finditer(cpv, ex):
    cpval,chk = m.groups()
    print("{0}-{1}".format(cpval,chk))

サンプル データの戻り値に適用されます

30124120-1
30124120-1
30124120-1
30124120-1
30124120-1

正規表現は次のように読み取ることができます。

(\d{8})         # eight digits

(?:             # followed by a sequence which does not get returned
  [ -.\t/\\]*   #   consisting of 0 or more
)               #   spaces, hyphens, periods, tabs, forward- or backslashes

(\d{1}\b)       # followed by one digit, ending at a word boundary
                #   (ie whitespace or the end of the string)

それが役立つことを願っています!

于 2011-01-13T02:27:41.520 に答える
1

re(Python の正規表現)のいずれかの関数を使用してみてください。詳細については、ドキュメントを参照してください。

これらのコードのさまざまな形式を受け入れる正規表現を作成し、re.findallまたは同様のものを使用して情報を抽出できます。CPV が何であるかわからないので、正規表現を持っていません (ただし、Google に正規表現があるかどうかはわかりますか?)

于 2011-01-12T19:08:05.370 に答える