0

引用された文字列(ブラックボックスから記録された航空会社のパイロットの引用)のテキストドキュメントを調べるPython正規表現を書いています。私は次のルールで正規表現を書こうとすることから始めました:

引用符の間にあるものを返します。
シングルで開く場合は、シングルで閉じる場合にのみ戻ります。
ダブルで開く場合は、ダブルで閉じる場合にのみ戻ります。

たとえば、「こんにちは」または「こんにちは」ではなく、「こんにちは」と「こんにちは」を一致させたいと思います。

私は次のようなものを含むテストページを使用します:

CA  "Runway 18, wind 230 degrees, five knots, altimeter 30."
AA  "Roger that"
18:24:10 [flap lever moving into detent]
ST: "Some passenger's pushing a switch. May I?"

だから私は簡単に始めることにしました:

 re.findall('("|\').*?\\1', page)
 ########## /("|').*?\1/ <-- raw regex I think I'm going for.

この正規表現は非常に予期しない動作をします。
私はそれがするだろうと思った:

  1. ("|")一重引用符または二重引用符のいずれかに一致し、後方参照/1として保存します。
  2. 。*?欲張りでないワイルドカードに一致します。
  3. \1バックリファレンス\1で見つかったものと一致します(ステップ1)。

代わりに、引用符の配列を返しますが、それ以外は返しません。

['"', '"', "'", "'"]

同等の(afaik)正規表現はVIMで問題なく機能するため、私は本当に混乱しています。

\("\|'\).\{-}\1/)

私の質問はこれです:
なぜそれは一致として括弧内にあるものだけを返すのですか?これは、バックリファレンスの理解における欠陥ですか?もしそうなら、なぜそれはVIMで動作するのですか?

そして、Pythonで探している正規表現をどのように書くのですか?

ご協力ありがとうございました!

4

3 に答える 3

3

Pythonが返す引用符以外は何もキャプチャしていません。

別のグループを追加すると、状況ははるかに良くなります。

for quote, match in re.finditer(r'("|\')(.*?)\1', page):
  print match

文字列リテラルの前にを付けてr文字列にしました。これは、大量のバックスラッシュを使用する必要がある場合に便利です(\\1になります\1)。

于 2012-07-28T18:31:26.000 に答える
1

余分な括弧のペアですべてをキャッチする必要があります。

re.findall('(("|\').*?\\2)', page)
于 2012-07-28T18:29:25.450 に答える
0

ドキュメントを読んでください。 re.findallグループがある場合は、グループを返します。一致全体が必要な場合は、すべてをグループ化するか、を使用する必要がありますre.finditerこの質問を参照してください。

于 2012-07-28T18:30:20.060 に答える