1

この複数行の変数を持つ:

raw = '''
CONTENT = ALL
TABLES = TEST.RAW_1
        , TEST.RAW_2
        , TEST.RAW_3
        , TEST.RAW_4
PARALLEL = 4
'''

構造は常にTAG = CONTENTです。両方の文字列は固定されておらずCONTENT、新しい行が含まれる可能性があります。

取得する必要がありregexます:

[('CONTENT', 'ALL'), ('TABLES', 'TEST.RAW_1\n        , TEST.RAW_2\n        , TEST.RAW_3\n        , TEST.RAW_4\n'), ('PARALLEL', '4')]

複数の組み合わせを試しましたが、タグのコンテンツが次のタグで区切られた複数行の文字列であるため、タグの適切なポイントでエンジン停止できません。regex TABLES

通訳者からのいくつかの試み:

>>> re.findall(r'(\w+?)\s=\s(.+?)', raw, re.DOTALL)
[('CONTENT', 'A'), ('TABLES', 'T'), ('PARALLEL', '4')]


>>> re.findall(r'^(\w+)\s=\s(.+)?', raw, re.M)
[('CONTENT', 'ALL'), ('TABLES', 'TEST.RAW_1'), ('PARALLEL', '4')]


>>> re.findall(r'(\w+)\s=\s(.+)?', raw, re.DOTALL)
[('CONTENT', 'ALL\nTABLES = TEST.RAW_1\n        , TEST.RAW_2\n        , TEST.RAW_3\n        , TEST.RAW_4\nPARALLEL = 4\n')]

ありがとう!

4

1 に答える 1

1

正の先読みを使用して、遅延して値を正しく一致させることができます。

(\w+)\s=\s(.+?)(?=$|\n[A-Z])
                ^^^^^^^^^^^^

.a が改行記号と一致するように、DOTALL 修飾子と共に使用します。(?=$|\n[A-Z])先読みは、文字列の最後まで、または大文字が続く改行まで一致する必要があります.+?

正規表現のデモを参照してください。

代替のより高速な正規表現 (上記の式のアンロール バージョンであるため) - ただし、DOTALL 修飾子は使用しないでください。

(\w+)\s*=\s*(.*(?:\n(?![A-Z]).*)*)

別の正規表現のデモを見る

説明:

  • (\w+)- グループ 1 で 1 つ以上の単語文字をキャプチャ
  • \s*=\s*-=オプションの (0+) 空白でラップされたシンボル
  • (.*(?:\n(?![A-Z]).*)*)- グループ 2 キャプチャ 0+ シーケンス:
    • .*- 改行以外の任意の 0+ 文字
    • (?:\n(?![A-Z]).*)*- 次の 0+ シーケンス:
      • \n(?![A-Z])- 大文字の ASCII 文字が続かない改行記号
      • .* - 改行以外の任意の 0+ 文字

Python デモ:

import re
p = re.compile(r'(\w+)\s=\s(.+?)(?=$|\n[A-Z])', re.DOTALL)
raw = '''
CONTENT = ALL
TABLES = TEST.RAW_1
        , TEST.RAW_2
        , TEST.RAW_3
        , TEST.RAW_4
PARALLEL = 4
'''
print(p.findall(raw))
于 2016-06-01T10:59:19.623 に答える