2016-07-18 12 views
0

「re」パッケージを使用してPythonの次の問題を解決するために、魔法の構文を理解しようと1時間を費やしました。私はしばらくの間、それを中心にハッキングしてきたが、課題を設定したいと思います:キャプチャカッコと貪欲でないマッチング制約を持つ正規表現

次の文字列は、我々のテストを表す:

*Structure song <!-- See Project:Project_Songs --> 
*Structure song | 
*Structure song title | 

目的は「歌」、「歌」を抽出することであり、これらから単一の正規表現を使用して '曲名'を作成します。

私の試み:

r'\*Structure ([^\|]*)(?:<)?' 

私は私がこれまで試した様々な組み合わせであなたを退屈しません。私の回避策は、アンパサンド '&'をキャプチャ括弧の除外セットに追加します。しかし、私はむしろ、抽出された文字列に '&'を含めることができないと仮定しません。

+0

代わりに、あなたの試合の最後の境界とは何でしょうか? –

+0

「タイトル」パターンと省略したいその他の点の間には、どんな違いがありますか? –

+1

複雑な正規表現を書くのではなく、単純に[unescape](https://docs.python.org/3/library/html.html#html.unescape)にしてください。 – jonrsharpe

答えて

2

私はドミトリのと同様のパターンを使用すると思いますが、より直線的な1:

\*Structure\s(.*?)(?=\s(?:<|\|)) 

regex demoを参照してください。

説明

  • \*Structure - リテラルストリング*Structure
  • \s - 空白(あなただけに必要がある場合にのみ、通常のスペースまたはタブと一致する、あるいは単なるスペースで[ \t]と交換空白にマッチする)
  • (.*?) - グループ1は、改行以外の0個以上の文字をキャプチャし、可能な限り最初の文字までできるだけ少なくします。
  • (?=\s(?:<|\|)) - (必要肯定先読み)
    • \s - 空白のいずれか...
      • <と続く - サブ<
      • |
      • - または...
      • \|
      • - リテラルパイプシンボル。

速くsynonymic代替正規表現はそれがあるthis demo

を参照してください

\*Structure\s(\S*(?:\s(?!<|\|)\S*)*) 

ようになります(アンロール・ループの原理に基づいているとして)同じ正規表現ですが、最も線形に書かれています。

+0

180ステップ(正規表現1)対98ステップ(正規表現2)。私は生産でRegex 2を使用します。 –

+0

はい、これは私が探しているものです。私は固定されていないので、可変数のスペースを許すように更新しました。 –

+0

もし少なくとも常に1つのスペースがあれば、 '+ *構造体\ s +(。*?)(?= \ s +(?:< | \ |))'または'\ *構造\ s +(\ S +(?:\ s +(?! < | \ |)\ S +)*)'となります。また、複数行の入力を持つ場合には、 '\ s'ではなく通常のスペースを使用する必要があります。 –

1

私は非貪欲な「何か」に続いて「& lt;」を使用することをお勧めしますまたは先読みとして表さパイプ文字:

\*Structure (.*?(?= &lt;)|.*?(?= \|)) 

デモ:https://regex101.com/r/rT3oV5/2

+0

ありがとうございますが、希望の文字列の後ろに "| <"がある場合は、それでもブレークします。 –

関連する問題