1. ホーム
  2. python

[解決済み] 生文字列正規表現」とは何か、どのように使うのか?

2023-06-24 04:06:37

質問

のpythonドキュメントから 正規表現 に関して '\' 文字について

<ブロッククオート

解決策は、Pythonの生の文字列表記を正規表現パターンに使うことです。 でバックスラッシュは特別な方法で処理されません。 をプレフィックスとする文字列リテラルでは、バックスラッシュは特別な方法で処理されません。 'r' . ですから r"\n" は 2 文字の文字列で を含む '\''n' であり、一方 "\n" は改行を含む一文字の文字列 は改行を含む1文字の文字列です。通常、パターンはPythonのコードでこの生の文字列表記を使用して表現されます。 コードで表現されます。

この生の文字列表記とは何ですか?生の文字列表記を使用する場合、以下のような意味になりますか? "*" はゼロ以上のインジケータではなく、リテラル文字として扱われるということですか?そんなはずはない、そうでなければ正規表現は完全に力を失ってしまう。しかし、もしそれが生の文字列であるなら、次のような場合、どうやって改行文字を認識するのでしょうか? "\n" は文字通りバックスラッシュであり "n" ?

ついていけません。

懸賞金のために編集します。

私は生の文字列正規表現がどのように改行、タブ、文字セットにマッチするかを理解しようとしています、例えば \w のように、単語に対して \d というように、バックスラッシュを普通の文字として認識しないような文字列パターンを使用すると、数字やその他すべてのものに対して、バックスラッシュを使用することができます。私は本当にいくつかの良い例を使用することができました。

どのように解決するのですか?

Zarkonnenの回答はあなたの質問に答えていますが、直接的ではありません。もっと直接的に、Zarkonnenから懸賞金をつかめるかどうか試してみましょう。

おそらく、quot;raw string regex" および "raw string patterns" という用語を使用するのをやめれば、より理解しやすくなると思います。これらの用語は、Python ソースコード内の特定の文字列の表現と、その文字列が表す正規表現という、2 つの別々の概念を混同しています。

実際、これらはそれぞれ独自の構文を持つ 2 つの異なるプログラミング言語であると考えるのが便利です。Python 言語には、特に、特定の内容を持つ文字列を構築し、正規表現システムを呼び出すソース コードがあります。正規表現システムは、文字列オブジェクトに存在するソースコードを持っており、文字列のマッチングを行います。どちらの言語もエスケープ文字としてバックスラッシュを使用します。

まず、文字列は文字の並びであることを理解しましょう(つまり、バイトまたはUnicodeコードポイントです;ここでは区別はあまり重要ではありません)。Pythonのソースコードで文字列を表現する方法はたくさんあります。A 生の文字列 は単にこれらの表現のうちの1つです。もし2つの表現が同じ文字列になるなら、それらは同等の振る舞いをします。

2文字の文字列を想像してください。 バックスラッシュ 文字に続いて n という文字が続きます。 の文字値が バックスラッシュ の文字値が92であること、そして n は110となり、この式で文字列が生成されます。

s = chr(92)+chr(110)
print len(s), s

2 \n

従来のPythonの文字列表記 "\n" はこの文字列を生成しません。代わりに、改行文字を含む1文字の文字列を生成します。そのため Python ドキュメント 2.4.1. 文字列リテラル バックスラッシュは、改行、バックスラッシュそのもの、引用符など、特別な意味を持つ文字をエスケープするために使用されます。

s = "\n"
print len(s), s

1 
 

(この例では改行が見えないことに注意してください。よく見ると、"1" の後に空白行があるのがわかります)。

2 文字の文字列を得るには、別の バックスラッシュ 文字を使って、元の文字列の特別な意味をエスケープする必要があります。 バックスラッシュ 文字を使用します。

s = "\\n"
print len(s), s

2 \n

を多く含む文字列を表現したい場合はどうすればよいでしょうか? バックスラッシュ を含む文字列を表現したい場合はどうすればよいでしょうか。 Python ドキュメント 2.4.1. 文字列リテラル は、文字列リテラルにはオプションで文字 'r' または 'R' を先頭に付けることができ、そのような文字列は 生の文字列 と、バックスラッシュのエスケープシーケンスの解釈のための異なるルールを使用します。

s = r"\n"
print len(s), s

2 \n

つまり、3つの異なる文字列表現がありますが、すべて同じ文字列、または文字のシーケンスを示しています。

print chr(92)+chr(110) == "\\n" == r"\n"
True

では、正規表現に目を向けてみましょう。その Python docs, 7.2. re - 正規表現操作 は、「正規表現では、特殊な形式を示すため、あるいは特殊な意味を持つ文字を呼び出すことなく使用できるようにするためにバックスラッシュ文字(' \')を使用する」と述べています。これは、Python が文字列リテラルで同じ目的のために同じ文字を使用することと衝突しています..."。

改行文字にマッチするPythonの正規表現オブジェクトが欲しい場合、2文字の文字列が必要で、その文字列は バックスラッシュ 文字に続いて n 文字が続きます。次のコード行はすべて、改行文字を認識する正規表現オブジェクトにプログを設定しています。

prog = re.compile(chr(92)+chr(110))
prog = re.compile("\\n")
prog = re.compile(r"\n")

では、なぜ "通常、パターンはこの生の文字列表記を使ってPythonのコードで表現されるでしょう。 ? なぜなら、正規表現は頻繁に静的な文字列を使用し、それは文字列リテラルとして便利に表現されるからです。そして、利用可能な様々な文字列リテラル表記法の中から、生の文字列は、正規表現が、"em "や "em "を含む場合に便利な選択です。 バックスラッシュ 文字が含まれている場合に便利です。

質問内容

Q : この式はどうでしょうか? re.compile(r"\s\tWord") ? A : 文字列と正規表現のコンパイルを分離し、別々に理解することでより理解しやすくなります。

s = r"\s\tWord"
prog = re.compile(s)

文字列 s には8つの文字が含まれています。 バックスラッシュ s , a バックスラッシュ , a t で、次に4つの文字 Word .

Q : タブやスペースはどうなるのでしょうか? A : Python言語レベルでは、文字列 s には タブ スペース という文字があります。の4文字で始まる。 バックスラッシュ , s , バックスラッシュ , t . 一方、正規表現システムでは、この文字列を正規表現言語のソースコードとして扱い、「空白文字、タブ文字、および次の4つの文字からなる文字列に一致する」という意味になります。 Word .

Q : バックラッシュ-sやバックスラッシュ-tとして扱われる場合、どのようにマッチングするのでしょうか? A : 正規表現システムはbacklash-sとbackslash-tという表現にどのようにマッチするのでしょうか。任意の空白文字'として、また' タブ 文字' としてです。

Q : また、backslash-n-newlineという3文字の文字列がある場合はどうでしょうか? A : Python言語では、backslash-n-newlineという3文字の文字列は、従来の文字列である "\\n\n" または、生の文字列と従来の文字列 r"\n" "\n" などの方法がある。正規表現システムは、3文字の文字列backslash-n-newlineにマッチするのは、2つの連続した 改行 文字にマッチする。

注:すべての例とドキュメントの参照は、Python 2.7です。

更新情報 : Vladislav Zorov氏、m.buettner氏の回答、およびAerovistae氏のフォローアップ質問から、明確なものを取り入れました。