Pythonの複数行の文字列をエスケープ文字と照合するための正規表現

ブラッドT。

Pythonソースコードを解析していて、一重引用符と二重引用符で囲まれた文字列の正規表現があります(このスレッドに対するridgerunnerの回答を読んで取得)。

single_quote_re = "'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)'";

double_quote_re = '"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"';

現在、Pythonの複数行の文字列(3つの二重引用符)を処理しようとしています。

s = '"""string one\'s end isn\'t here; \\""" it\'s here """ """string two here"""'
# correct output for findall should be:
#     ['string one\'s end isn\'t here; \\""" it\'s here ','string two here']

少しいじってみましたが、それでも正しくありません。

multiline_string_re = '"""([^(""")\\\\]*(?:\\\\.[^(""")\\\\]*)*)"""'

直前に円記号が付いていない(つまり、最初の二重引用符がエスケープされていない)「」を言う方法が必要です。

編集:私は近づく必要があります。私は以下を試しました:

r'(?<!\\)""".*(?<!\\)"""'
# Matches the entire string; not what I'm going for.

r'(?<!\\)"""[^((?<!\\)""")](?<!\\)"""'
# Matches that space between the two strings ('""" """') in the sample string s (see code above, prior to edit).

r'(?<!\\)"""([^((?<!\\)""")]*(?:\\.[^((?<!\\)""")]*)*)(?<!\\)"""'
# Same result as before, but with the triple quotes shaved off (' ').
# Note: I do indeed want the triple quotes excluded.

更新: slnのおかげで、解決策は "" "[^" \\] (?:(?:\\。| "")[^ "\\] )*" ""の ように見えます

multiline_string_re = '"""[^"\\\\]*(?:(?:\\\\.|"")[^"\\\\]*)*"""'
re.findall(multiline_string_re, s, re.DOTALL)
# Result:
# ['"""string one\'s end isn\'t here; \\""" it\'s here """', '"""string two here"""']

更新されたソリューション、slnのおかげで:

multiline_single_re = "'''[^'\\\\]*(?:(?:\\\\.|'{1,2}(?!'))[^'\\\\]*)*'''"
multiline_double_re = '"""[^"\\\\]*(?:(?:\\\\.|"{1,2}(?!"))[^"\\\\]*)*"""'
user557597

これは、Perlで正規表現を使用したテストケースです。エスケープ
された二重引用符フォーム ""だけでなく、エスケープされたものも許可する
場合は、サイトに配置し正規表現の1つを変更して、二重引用符を許可します。

一重引用符をエスケープすると、ソース文字列が削除されます。

 use strict;
 use warnings;

 $/ = undef;

 my $str = <DATA>;

 while ($str =~ /"[^"\\]*(?:(?:\\.|"")[^"\\]*)*"/sg )
 {
  print "found $&\n";

 }

  __DATA__

  """string one's end isn't here; \""" it's here """ """string two here"""

出力>>

 found """string one's end isn't here; \""" it's here """
 found """string two here"""

有効性とエラー処理のために、正規表現には
、whileループの本体で処理できるパススルー構造(代替)が含まれている必要があることに注意してください。
/"[^"\\]*(?:(?:\\.|"")[^"\\]*)*"|(.)/sg
次に
while(){
//グループ1に一致し、空白ではない場合=エラーの可能性
}

追加-コメントへの返信。

Pythonブロックリテラルに関するいくつかの調査の後

エスケープ文字だけでなく
、本文で最大2つの二重引用符を処理する必要があるようです。つまり、"または""

正規表現を変更するのは簡単です。1-2の数量詞を追加し、先読みアサーションで抑制します。

以下は、選択して選択できる生の正規表現パーツと文字列の正規表現パーツです。
Perlでテストされ、動作します。
がんばろう!

 # Raw - 
 #   (?s:
 #   """[^"\\]*(?:(?:\\.|"{1,2}(?!"))[^"\\]*)*"""
 #   |
 #   '''[^'\\]*(?:(?:\\.|'{1,2}(?!'))[^'\\]*)*'''
 #   )
 # String'd -
 #   '(?s:'
 #   '"""[^"\\\]*(?:(?:\\\.|"{1,2}(?!"))[^"\\\]*)*"""'
 #   '|'
 #   "'''[^'\\\\]*(?:(?:\\\\.|'{1,2}(?!'))[^'\\\\]*)*'''"
 #   ')'


 (?s:                # Dot-All
      # double quote literal block
      """                 # """ block open
      [^"\\]*             # 0 - many non " nor \
      (?:                 # Grp start
           (?:
                \\ .                # Escape anything
             |                      # or
                "{1,2}              # 1 - 2 "
                (?! " )             # Not followed by a "
           )
           [^"\\]*             # 0 - many non " nor \
      )*                  # Grp end, 0 - many times
      """                 # """ block close

   |                      # OR, 

      # single quote literal block
      '''                 # ''' block open
      [^'\\]*             # 0 - many non ' nor \
      (?:                 # Grp start
           (?:
                \\ .                # Escape anything
             |                      # or
                '{1,2}              # 1 - 2 '
                (?! ' )             # Not followed by a '
           )
           [^'\\]*             # 0 - many non ' nor \
      )*                  # Grp end, 0 - many times
      '''                 # ''' block close
 )

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Pythonの複数行の文字列をエスケープ文字と照合するためのflexの使用

分類Dev

複数行の文字列で複数のヘッダーとその段落を照合するPython正規表現

分類Dev

複数の文字グループをPythonの正規表現と照合する

分類Dev

数値と文字列を照合するための正規表現

分類Dev

文字列内の複数のキーを照合するためのJava正規表現

分類Dev

文字列を部分文字列と照合するための正規表現

分類Dev

文字列(英数字)をPythonのすべての一意の文字と照合するための正規表現

分類Dev

MongoDB文字列を照合するための正規表現

分類Dev

文字列を照合するための正規表現

分類Dev

HTML文字列を照合するための正規表現

分類Dev

複数行のテキストでグループを照合するための正規表現

分類Dev

複数行のテキストを照合するための正規表現

分類Dev

文字列を複数の正規表現と照合する方法は?

分類Dev

文字列を複数の正規表現パターンと照合します

分類Dev

2つの部分文字列間で任意の数の要素を照合するためのPython正規表現?

分類Dev

長い文字列内のStartWithおよびEndWith文字列と複数の文字列を照合する正規表現

分類Dev

正規表現:複数行にわたる不要なデータと混合された2つのキーワード間の文字列を照合します

分類Dev

特定の文字列を除くすべての文字列を照合するためのPython正規表現

分類Dev

クエリ文字列のパターンを照合するための正規表現

分類Dev

Python文字列の正規表現特殊文字をエスケープする

分類Dev

文字列のリストから最初の文字列を照合するためのパンダ/正規表現ベースのアプローチ

分類Dev

エスケープ文字を解析するための正規表現

分類Dev

特殊文字をエスケープするための正規表現

分類Dev

年の前に文字列を照合するための正規表現1

分類Dev

文字列の計算を照合するための正規表現

分類Dev

文字列内の2つの同じ文字の最初の文字のみを照合するための正規表現

分類Dev

1行あたりの文字列の最初の出現のみを正規表現と照合する方法

分類Dev

空でない区切り文字列のシーケンスを正規表現と照合する

分類Dev

grepを使用して2列目と5列目の文字列を照合するための正規表現

Related 関連記事

  1. 1

    Pythonの複数行の文字列をエスケープ文字と照合するためのflexの使用

  2. 2

    複数行の文字列で複数のヘッダーとその段落を照合するPython正規表現

  3. 3

    複数の文字グループをPythonの正規表現と照合する

  4. 4

    数値と文字列を照合するための正規表現

  5. 5

    文字列内の複数のキーを照合するためのJava正規表現

  6. 6

    文字列を部分文字列と照合するための正規表現

  7. 7

    文字列(英数字)をPythonのすべての一意の文字と照合するための正規表現

  8. 8

    MongoDB文字列を照合するための正規表現

  9. 9

    文字列を照合するための正規表現

  10. 10

    HTML文字列を照合するための正規表現

  11. 11

    複数行のテキストでグループを照合するための正規表現

  12. 12

    複数行のテキストを照合するための正規表現

  13. 13

    文字列を複数の正規表現と照合する方法は?

  14. 14

    文字列を複数の正規表現パターンと照合します

  15. 15

    2つの部分文字列間で任意の数の要素を照合するためのPython正規表現?

  16. 16

    長い文字列内のStartWithおよびEndWith文字列と複数の文字列を照合する正規表現

  17. 17

    正規表現:複数行にわたる不要なデータと混合された2つのキーワード間の文字列を照合します

  18. 18

    特定の文字列を除くすべての文字列を照合するためのPython正規表現

  19. 19

    クエリ文字列のパターンを照合するための正規表現

  20. 20

    Python文字列の正規表現特殊文字をエスケープする

  21. 21

    文字列のリストから最初の文字列を照合するためのパンダ/正規表現ベースのアプローチ

  22. 22

    エスケープ文字を解析するための正規表現

  23. 23

    特殊文字をエスケープするための正規表現

  24. 24

    年の前に文字列を照合するための正規表現1

  25. 25

    文字列の計算を照合するための正規表現

  26. 26

    文字列内の2つの同じ文字の最初の文字のみを照合するための正規表現

  27. 27

    1行あたりの文字列の最初の出現のみを正規表現と照合する方法

  28. 28

    空でない区切り文字列のシーケンスを正規表現と照合する

  29. 29

    grepを使用して2列目と5列目の文字列を照合するための正規表現

ホットタグ

アーカイブ