0

次の種類のデータを含むデータセットがあります。

company_id, company_name, country
1, a Tech, germany
2, a Tech AG, germany
3, a Tech gmbh, germany
4, AF, germany
5, AF gmbh, vermany

ID を完全一致に割り当てた予備検索に基づいて、これらの会社に company_id を既に割り当てています。今、私は次のことをしたい:

1) 会社名がその下の会社名と完全に同じかどうかを検出する正規表現を記述します。

正規表現を正しく取得するためのロジックを除いて、すべて完了しました。例えば:

    for next_row in reader:
        first_name = first_row['company_name']
        next_name = next_row['company_name']

        if first_name == next_name:##FIX ME
            #do stuff
        writer.writerow(first_row)
        first_row = next_row

等価性テストのロジックは、if first_name == next_name -- ではなく、first_name が last_name に gmbh を加えたものと等しい場合にすべきではありません...

説明をいただければ幸いです。

4

3 に答える 3

1

私はあなたが欲しいものは次のようなものだと思います

import re
regx = "([\w\s]+).*\1\s*gmbh"
re.findall(regx,my_target_text,re.MULTILINE)

とにかくそのようなもの(\ 1は正規表現の最初の親をキャプチャすると思います...しかし、その部分は間違っている可能性があります)

また、正規表現の使用について質問しているので、これは宿題のように聞こえますが、正規表現を使用する必要はあまりありません。

[編集/注]これは完全な実装ではなく、正規表現の大幅な調整が必要になる場合があります...(ただし、同様になります)

于 2012-08-29T18:55:49.140 に答える
1

彼の例には AG と gmhb の両方がありますか?

このようなことを試してみませんか。

for next_row in reader:
    first_name = first_row['company_name']
    next_name = next_row['company_name']
    checkLength = len(first_name)

    if first_name == next_name[:checkLength] :  ##FIX ME
        #do stuff
    writer.writerow(first_row)
    first_row = next_row 

これは、持ち込まれた名前の長さのみをチェックし、接尾辞はチェックで無視されます。

于 2012-08-30T01:11:19.217 に答える
1

アルゴリズム

  1. 文字列で正規表現(.*?)(\s+AG)?を検索し、 . これにより、 のない会社名が表示されます。first_name\1AG
  2. 結果を に割り当ててからfirst_name_without_AG、次のようにします。next_name == first_name_without_AG + ' gmbh'

サンプル実装

import re
first_name_without_AG = re.sub("(.*?)(\\s+AG)?", "\\1", first_name)
next_name == first_name_without_AG + ' gmbh'
于 2012-08-30T00:42:52.203 に答える