2

正規表現の専門家が助けてください! 次の2つの例があります。

'(JEN) This is a sentence.'
'This is another sentence (412).'

次の方法で、これら 2 つの文のさまざまな要素を抽出しようとしています (要素の種類が 3 つあることがわかっています)。

['JEN', 'This is a sentence', None]
[None, 'This is another sentence', 412]

これを解決する方法を知っている人はいますか?

次の正規表現を試しました:

r'(\(([A-Z]{3})\))?\s*([\w- ]+)?\s*(\(([0-9]{3})\))?'
r'(?:\(([A-Z]{3})\)\s*)(?:([\w- ]+))(?:\(([0-9]{3})\))' # Passive Groups

どちらの場合も、無効な正規表現のエラーが発生します。

理由はありますか?

4

2 に答える 2

2

sre_constants.error: bad character range[\w- ]が範囲として解釈されるために発生します。を使用することは可能[\w -]ですが、通常-は文字クラス内でエスケープする必要があります: [\w\- ].

また、式は同等ではありません (グループ化を除いて)。それが意図的だったかどうかはわかりませんが、 の非キャプチャ バージョン(regex)?(?:regex)?ではなくであることに注意してください(?:regex)。最初の式と同様に動作するには、2 番目の式を次のようにする必要があります。

r'(?:\(([A-Z]{3})\))?\s*([\w\- ]+)?\s*(?:\(([0-9]{3})\))?'
于 2013-01-17T04:34:34.350 に答える
0

個人的には、グループ内の実際の括弧をキャプチャするだけでよいと思います。グループ 1 と 3 の結果のキャプチャにはそれらがあることがわかっているので、対応できます。正規表現は確かに正気です。

また、この文脈における「文」は、おそらく「右括弧以外のもの」としてより適切に定義されます。そうは言っても、これはすべての入力に対して機能します。

r'(\([A-Z]{3}\))?\s*([^(]+)(\(\d{3}\))?'
于 2013-01-17T06:18:17.083 に答える