2016-11-08 4 views
1

解析するテキストファイルがあります。このファイルには、ヘッダーのコレクションのいずれか1つが含まれていても含まれていなくても、すべてのヘッダーグループの前に二重改行があります。正規表現で空の文字列を返す方法を許可する方法

ヘッダーが表示された直後に2重改行がある場合は、空の文字列を返す正規表現を求めています。私は、文書に内容がないヘッダーがあるかどうか、またはヘッダーがまったくないかどうかを区別する必要があります。ここで例えば

は、二つの文書の一部である:

Dogs 
Spaniel 
Beagle 

Birds 
Parrot 

Dogs 

Amphibians 
Frogs 
Salamanders 

私は最初の文書でSpaniel\nBeagleを返します正規表現、および第二のために空の文字列をしたいと思います。

私が見つけた最も近いものは(Pythonの構文で)expr = re.compile("Dogs(.+?|)?\n\n, re.DOTALL)です。これは最初のものの正しい値を返しますが、後者の場合は\n\nAmphibians\nFrogs\nSalamandersを返します。 2番目の疑問符とパイプは、私が望んでいたことをしません。

今私はDogs\n\nを検索し、その正規表現が見つからない場合にのみ内容を返すが、それは仕事をしている単一の正規表現の感触を打ち負かすものではないため、不満足です。

So:2番目のドキュメントと一致する正規表現があり、""を返しますか?

+2

用途: 'exprの= re.compile(。r'Dogs * \ N \ N ')' – anubhava

+0

良い主人、私が今までそれをoverthinkingでした。ありがとうございました! – prooffreader

+0

"仕事をしている単一の正規表現の感覚に勝るものはありません。":これは素朴な信念です。 –

答えて

0

通報

あなたDogs(.+?|)?\n\nパターンは、どこでも文書内の単語Dogsと一致次いで(空の代替|)があるように)任意1以上(起因する+?数量詞と一致随意しよう(+?の怠け者です)、最初の2改行までです。意味

、正規表現のいずれかと一致するDogsそこには二重の改行記号がテキストのどこかに、さらにません、または.+?は1つの改行を消費しますので、それは、任意のテキスト最初の二重改行記号までありをつかむ場合にのみ、 \n\nパターン部分はDogsの後に2つの改行を見つけることができません。

ソリューションは

あなたはゼロ以上文字にマッチできるようにする代わりに+? 1の*?数量詞を使用することができます。 Dogs(.*?)\n\nは、Dogsの直後に表示されるものであっても、最初は\n\nまで、Dogs、可能な限り0+の文字はありません。

最適化

あなたは非常に長い文字列を処理し、そしてDogsは、行の先頭に表示された場合.*?が長い入力を備えた正規表現の実行を遅らせることが知られているので、あなたが展開された正規表現を使用することができます。

使用

expr = re.compile(r"^Dogs(.*(?:\n(?!\n).*)*)", re.MULTILINE) 

それが一致する、基本的にregex demo

を参照してください

  • ^ - ラインの開始
  • DogsからDogsサブ
  • (.*(?:\n(?!\n).*)*) - グループ1つの捕捉:
    • .* - のゼロまたはそれ以上の配列 - 改行文字(re.DOTALL改質剤を使用しないように)
    • (?:\n(?!\n).*)*以外ゼロ以上の文字:
      • \n(?!\n) - 改行別の改行で
      • .*従わない - 改行文字以外のゼロ個以上の文字を
関連する問題