4

それぞれ約 190000 行の 11 ファイルのテキスト コーパスがあります。10 個の文字列があり、そのうちの 1 つ以上が上記のコーパスの各行に表示されます。

10 個の文字列のいずれかに遭遇した場合、行に表示される文字列を個別に記録する必要があります。すべての行の正規表現をループしてマークする力ずくの方法には、長い時間がかかります。これを行う効率的な方法はありますか?

TRUE または FALSE の出力を提供する投稿 ( Match a line with multiple regex using Python ) を見つけました。しかし、次の行から一致する正規表現を記録するにはどうすればよいですか。

any(regex.match(line) for regex in [regex1, regex2, regex3])

編集:例の追加

regex = ['quick','brown','fox']
line1 = "quick brown fox jumps on the lazy dog" # i need to be able to record all of quick, brown and fox
line2 = "quick dog and brown rabbit ran together" # i should record quick and brown
line3 = "fox was quick an rabit was slow" # i should be able to record quick and fox.

正規表現をループして一致するものを記録することは解決策の 1 つですが、スケール (11 * 190000 * 10) を見ると、私のスクリプトはしばらく実行されています。私は自分の仕事でこれを何度も繰り返す必要があります。だから私はより効率的な方法を探していました。

4

2 に答える 2

7

以下のアプローチは、一致が必要な場合です。一致をトリガーしたリストに正規表現が必要な場合は、運が悪く、おそらくループする必要があります。

あなたが提供したリンクに基づいて:

import re
regexes= 'quick', 'brown', 'fox'
combinedRegex = re.compile('|'.join('(?:{0})'.format(x) for x in regexes))

lines = 'The quick brown fox jumps over the lazy dog', 'Lorem ipsum dolor sit amet', 'The lazy dog jumps over the fox'

for line in lines:
    print combinedRegex.findall(line)

出力:

['quick', 'brown', 'fox']
[]
['fox']

ここでのポイントは、正規表現をループするのではなく、それらを結合することです。ループ アプローチとの違いは、re.findall重複する一致が見つからないことです。たとえば、正規表現が : の場合、regexes= 'bro', 'own'上記の行の出力は次のようになります。

['bro']
[]
[]

一方、ループ アプローチの結果は次のようになります。

['bro', 'own']
[]
[]
于 2012-10-23T12:53:28.267 に答える