2

次の問題があります-データはdb(oracle)から取得されますが、python(正規表現を使用)で解決したいと考えていました。ただし、プロセスが妥当な時間内に終了しないのではないかと心配しているため、いくつかの提案を使用できます. データベースからデータを python リストに引き出すと、次のようになります: キーワード、5000 個の文字列のリスト、それぞれの長さが 40 以下30 000 のストリングで、それぞれの長さは 20 から 50 の間です

pattern1 = number keyword pattern2 = number keyword1 anything number keyword2 の形式のパターンを search_words で検索したい

これらのパターンをリストに集めてから、found_phrases に既にあるものを削除します。

まず、Pythonで次のことを試しました:

found = []
p1 = r'[0-9.]+[/\s-]*'
pattern1 = re.compile(r'|'.join([p1 + word for word in keywords])
for phrase in search_phrases:
    found.extend(re.findall(pattern1, phrase))
return set(found).difference(found_phrases)

正規表現の OverflowError のため、これは機能しません。代わりに、二重の for ループを実行しました。

for phrase in search_phrases:
    for word in keywords:
        found.extend(re.findall(p1 + word, phrase))

しかし、これには時間がかかりすぎています (つまり、まだ完了していません)。

これについて何か提案があれば、Python でより速く完了する方法、またはデータベースにとどまり (リストは単に 2 つの異なるテーブルからの別個の列エントリです)、そこで正規表現を行う方法を学ぶための推奨事項のいずれかで、私に知らせてください。 . ありがとう。

アップデート1:

現在、パターン 1 (時間の制約) のみを検索しており、for ループの順序を次のように切り替えています。

for word in keywords:
    for phrase in search_phrases:
        found.extend(re.findall(p1+word, phrase))

この順序で、サンプルの search_phrase リスト (30 000 要素) を約 90 秒で実行します。

grep -f キーワード search_phrases の場合、結果のファイルは約 5% だけ短くなります (ほとんどの search_phrases が一致します)。

キーワードの例: 'g', 'gr', 'G', 'gram', 'grams', 'mg', 'milli gram', 'Milli-gram' , ... (さらに、考えられるすべてのバリエーション質量の測定用) search_phrases の例: '

4

1 に答える 1

0

You can use htql.RegEx from http://htql.net. It can handle large lists well. Here is the example from its website:

import htql; 
address = '88-21 64th st , Rego Park , New York 11374'
states=['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', 
    'Delaware', 'District Of Columbia', 'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 
    'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', 'Michigan', 
    'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire', 
    'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota', 'Ohio', 'Oklahoma', 
    'Oregon', 'PALAU', 'Pennsylvania', 'PUERTO RICO', 'Rhode Island', 'South Carolina', 'South Dakota', 
    'Tennessee', 'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 
    'Wyoming']; 

a=htql.RegEx(); 
a.setNameSet('states', states);

state_zip1=a.reSearchStr(address, "&[s:states][,\s]+\d{5}", case=False)[0]; 
# state_zip1 = 'New York 11374'
于 2013-10-31T15:50:51.497 に答える