Python正規表現は反スラッシュ''問題に一致する
3472 ワード
csdnblogから転載:Python正規表現マッチング反スラッシュ''問題
Pythonの正規式を勉強する過程で、反スラッシュ(すなわち「」)にどうやってマッチングするかという問題がずっと悩まされていました.
一、導入
Pythonの特殊文字と元の文字列を勉強した後、答えはこうだと思います.1)普通の文字列:''2)元の文字列:r''ですが、実際には「38」の反スラッシュのような前の数字を抽出するとき、私は何度も壁にぶつかって、結果が得られませんでした.結局、自分の理解が間違っていることに気づいた.元の文字列は「正則転義」とは少しも関係がない.詳しくお話しします.
二、文字列変換
反スラッシュは、Pythonでは特殊ですが、「」は改行、「t」はタブを表すなど、特殊な文字を構成するために使用できます.次の行は、「」を使用するコードです.
その結果、「HelloWorldPython」では「」が改行文字に変換されていることがわかりますが、「W」は「文字列変換」では特殊文字に対応せず、特別な意味を持たないため、変換は発生しません.
今要求が変わって、「」を改行せずにそのまま「HelloWorldPython」と出力したらどうなるでしょうか.
1)このように「HelloWorldPython」と書いて出力すると、「文字列エスケープ」は「\」を「」にエスケープします.2)元の文字列、元の文字列(すなわちr'...'):文字列内のすべての文字は直接字面の意味で使用され、特殊な文字はエスケープされません.次に、元の文字列を使用するコードを示します.
その結果、「HelloWorldPython」は、元の文字列を使用した後、「」は改行文字に変換されず、直接出力されることが明らかになった.
三、正則転義
はい、上の説明は「文字列変換」だけです.同様に、正規表現にもエスケープがあります.まず「正規エスケープ」と呼びます.「文字列エスケープ」とはまったく異なります.たとえば、「d」は数字を表し、「s」は空白文字を表します.次に、冒頭の例を作成してから分析します.「38」バックスラッシュの前の数値を抽出します.
正規表現文字列は2回のエスケープが必要で、この2回はそれぞれ上の「文字列エスケープ」と「正規エスケープ」であり、個人的には「文字列エスケープ」は必ず「正規エスケープ」より先にあると考えている.
1)'\\\'のプロセス:まず「文字列変換」を行い、前の2つの反スラッシュと後の2つの反スラッシュはそれぞれ1つの反スラッシュに変換された.すなわち、「\|\」は「|」(「|」は読みやすいように、自動的に無視してください)に変換されます.「文字列エスケープ」後すぐに「正規エスケープ」が行われ、「\」は「」にエスケープされ、この正規式が反スラッシュに一致する必要があることを示します.
2)r'\'のプロセス:元の文字列のすべての文字が直接字面の意味で使用され、特殊な文字を転義しないため、「文字列転義」を行わず、直接第2のステップ「正則転義」に進み、正則転義では「\」が「」に転義され、この正則式が反スラッシュに一致する必要があることを示す.
四、結論
すなわち、元の文字列(すなわちr'......')は「正則的エスケープ」とは無関係であり、元の文字列は「文字列エスケープ」にのみ作用し、文字列を一度のエスケープから免れる.
Pythonの正規式を勉強する過程で、反スラッシュ(すなわち「」)にどうやってマッチングするかという問題がずっと悩まされていました.
一、導入
Pythonの特殊文字と元の文字列を勉強した後、答えはこうだと思います.1)普通の文字列:''2)元の文字列:r''ですが、実際には「38」の反スラッシュのような前の数字を抽出するとき、私は何度も壁にぶつかって、結果が得られませんでした.結局、自分の理解が間違っていることに気づいた.元の文字列は「正則転義」とは少しも関係がない.詳しくお話しします.
二、文字列変換
反スラッシュは、Pythonでは特殊ですが、「」は改行、「t」はタブを表すなど、特殊な文字を構成するために使用できます.次の行は、「」を使用するコードです.
>>>print ('Hello\World
Python' )
その結果、「HelloWorldPython」では「」が改行文字に変換されていることがわかりますが、「W」は「文字列変換」では特殊文字に対応せず、特別な意味を持たないため、変換は発生しません.
今要求が変わって、「」を改行せずにそのまま「HelloWorldPython」と出力したらどうなるでしょうか.
1)このように「HelloWorldPython」と書いて出力すると、「文字列エスケープ」は「\」を「」にエスケープします.2)元の文字列、元の文字列(すなわちr'...'):文字列内のすべての文字は直接字面の意味で使用され、特殊な文字はエスケープされません.次に、元の文字列を使用するコードを示します.
print r'Hello\World
Python'
その結果、「HelloWorldPython」は、元の文字列を使用した後、「」は改行文字に変換されず、直接出力されることが明らかになった.
三、正則転義
はい、上の説明は「文字列変換」だけです.同様に、正規表現にもエスケープがあります.まず「正規エスケープ」と呼びます.「文字列エスケープ」とはまったく異なります.たとえば、「d」は数字を表し、「s」は空白文字を表します.次に、冒頭の例を作成してから分析します.「38」バックスラッシュの前の数値を抽出します.
import re
string = '3\8'
m = re.search('(\d+)\\\\', string)
if m is not None:
print m.group(1) # :3
n = re.search(r'(\d+)\\', string)
if n is not None:
print n.group(1) # :3
正規表現文字列は2回のエスケープが必要で、この2回はそれぞれ上の「文字列エスケープ」と「正規エスケープ」であり、個人的には「文字列エスケープ」は必ず「正規エスケープ」より先にあると考えている.
1)'\\\'のプロセス:まず「文字列変換」を行い、前の2つの反スラッシュと後の2つの反スラッシュはそれぞれ1つの反スラッシュに変換された.すなわち、「\|\」は「|」(「|」は読みやすいように、自動的に無視してください)に変換されます.「文字列エスケープ」後すぐに「正規エスケープ」が行われ、「\」は「」にエスケープされ、この正規式が反スラッシュに一致する必要があることを示します.
2)r'\'のプロセス:元の文字列のすべての文字が直接字面の意味で使用され、特殊な文字を転義しないため、「文字列転義」を行わず、直接第2のステップ「正則転義」に進み、正則転義では「\」が「」に転義され、この正則式が反スラッシュに一致する必要があることを示す.
四、結論
すなわち、元の文字列(すなわちr'......')は「正則的エスケープ」とは無関係であり、元の文字列は「文字列エスケープ」にのみ作用し、文字列を一度のエスケープから免れる.