1

正規表現 (RE) を使用して大量のテキスト ファイルのサンプルを解析しようとしています。これらのファイルから'vu'を含み、改行'\n'で終わるテキストの部分を抽出しようとしています。

パターンはファイルごとに異なるため、OR演算子を使用してファイル内の RE の組み合わせを探してみました。しかし、re.findall()関数が RE の組み合わせを探すようにコードを自動化する方法が見つかりませんでした。

これは、この問題にどのように対処しようとしたかの例ですが、どうやらre.findall()で正規表現と OR 演算子の両方をまだ評価できないようです。

import re

def series2string(myserie) :
    myserie2 = ' or '.join(serie for serie in myserie)
    return myserie2

def expression(pattern, mystring) : 
    x = re.findall(pattern, mystring)
    if len(x)>0:
        return 1
    else:
        return 0

#text example
text = "\n\n    (troisième chambre)\n    i - vu la requête, enregistrée le 28 février 1997 sous le n° 97nc00465, présentée pour m. z... farinez, demeurant ... à dommartin-aux-bois (vosges), par me y..., avocat ;\n"

#expressions to look out
pattern1 = '^\s*vu.*\n'
pattern2 = '^\s*\(\w*\s*\w*\)\s*.*?vu.*\n'

pattern = [pattern1, pattern2]
pattern = series2string(pattern)

expression(pattern, text)

注: for ループで各パターンを検索することでこの問題を回避しましたが、 re.findall()を 1 回だけ使用できればコードの実行速度は速くなります。

4

2 に答える 2

5

Python の正規表現では、|演算子を交互に使用します。

def series2string(myserie) :
    myserie2 = '|'.join(serie for serie in myserie)
    myserie2 = '(' + myserie2 + ')'
    return myserie2

詳細: https://docs.python.org/3/library/re.html


個々のパターンがめちゃくちゃで、何が間違いで何が意図的なのかわかりません。いくつかの異なる文脈で「vu」という単語を探していると思います。

  1. 正規表現には常に Python の生の文字列を使用し、接頭辞r( r'pattern here') を付けます。\Python が文字列エスケープとして解釈しようとすることなく、パターンで使用することができます。正規表現エンジンに直接渡されます。(参照)
  2. \s空白 (スペースと改行) を一致させるために使用します。
  3. (すでにいくつかの代替パターンがあるため、)オプションにしないでください。破滅的なバックトラッキングが発生する可能性があり、大きな文字列の照合が非常に遅くなる可能性があります。
    \(?\(
    \)?\)
  4. {1}何もしません。前のサブパターンを 1 回繰り返すだけで、何も指定しないのと同じです。
  5. \br無効です。\b(ASCII ベル文字) + 文字として解釈されrます。
  6. 'テキスト文字列の先頭に引用符 ( ) があります。^任意の行の先頭に一致させるつもりであるか'、コピー/貼り付けエラーです。
  7. パターンを組み合わせる際のいくつかのエラー:

    pattern = [pattern1, pattern2, pattern3, pattern4]
    pattern = series2string(pattern)
    
    expression(re.compile(pattern), text)
    
于 2015-09-21T08:25:05.183 に答える
1

ヒントをありがとう。最初の投稿では、私の正規表現は少し不器用でした (質問がより理解しやすくなるように変更しました)。' ' のおかげでOR演算子 ' 'をなんとかキャプチャでき、コードは正常に動作しました!|re.compile

import re

def series2string(myserie) :
    myserie2 = '|'.join(serie for serie in myserie)
    return myserie2

def expression(pattern, mystring) : 
    x = re.findall(pattern, mystring)
    if len(x)>0:
        return 1
    else:
        return 0

#text example
text = "\n\n    (troisième chambre)\n    i - vu la requête, enregistrée le 28 février 1997 sous le n° 97nc00465, présentée pour m. z... farinez, demeurant ... à dommartin-aux-bois (vosges), par me y..., avocat ;\n"

#expressions to look out
pattern1 = r'^\s*vu.*\n'
pattern2 = r'^\s*\(\w*\s*\w*\)\s*.*?vu.*\n'

pattern = [pattern1, pattern2]
pattern = series2string(pattern)

expression(re.compile(pattern), text)
于 2015-09-22T20:54:18.687 に答える