エスケープ シーケンスは通常、2 つの機能を果たします。1 つ目の機能は、アルファベットでは直接表現できない特殊なデータをエンコードすることです。2 番目の関数は、キーボードで直接入力できない文字 (復帰など) を表すために使用されます。
C 言語では、バックスラッシュ文字「\」は、印刷不可能な ASCII 制御文字を表すエスケープ文字として使用されます。さらに、URI プロトコルでは、リクエスト文字列内の一部の記号は特別な意味を持ち、エスケープする必要があります。エスケープ文字はパーセント記号「%」です。この文字がエスケープ文字と呼ばれる理由は、その背後にある文字が本来の意味ではないためです。
以下に、一般的なエスケープ文字とその意味を示します。
正規表現もバックスラッシュでエスケープされます。一般に、正規表現の \d は単一の数値を表しますが、バックスラッシュと文字 d で表現したい場合は、この時点でエスケープして \\d と記述する必要があります。これは、バックスラッシュがその後に文字 d が続きます。
先ほどのバックスラッシュとdは連続する2文字ですが、バックスラッシュやdとして表現したい場合は、\|dや[\d]のようにパイプ記号や角括弧を使用することで実現できます。
正規表現で「バックスラッシュ」を正しく表現する具体的なプロセスは次のとおりです: 入力した文字列、4 つのバックスラッシュ \\、文字列エスケープの最初のステップの後、それは 2 つのバックスラッシュ \ を意味します; これら 2 つのバックスラッシュは、次の 2 番目のステップでエスケープされます。正規化されており、単一のバックスラッシュ \ を表すことができます。
メタキャラクターではなく、アスタリスク (*)、プラス記号 (+)、疑問符 (?) などの関数自体を検索したい場合は、それらをエスケープする必要があり、それらの前にバックスラッシュを追加するだけで OK です。
角括弧 [] と中括弧 {} は正規表現の左括弧のみをエスケープする必要がありますが、括弧 () は両方ともエスケープする必要があります。正規表現では、括弧は通常、グループ化するため、または一部を全体として扱うために使用されます。左括弧または右括弧だけをエスケープすると、正規表現では残りの半分が欠落しているとみなされるため、エラーが報告されます。
文字グループ内でエスケープする必要がある状況は 3 つあります
1. キャレットは角括弧で囲まれており、最初の位置でエスケープする必要があります。
>>> import re
>>> re.findall(r'[^ab]', '^ab') # 转义前代表"非"
['^']
>>> re.findall(r'[\^ab]', '^ab') # 转义后代表普通字符
['^', 'a', 'b']
2. ダッシュは角括弧内にあり、先頭と末尾にはありません。
>>> import re
>>> re.findall(r'[a-c]', 'abc-') # 中划线在中间,代表"范围"
['a', 'b', 'c']
>>> re.findall(r'[a\-c]', 'abc-') # 中划线在中间,转义后的
['a', 'c', '-']
>>> re.findall(r'[-ac]', 'abc-') # 在开头,不需要转义
['a', 'c', '-']
>>> re.findall(r'[ac-]', 'abc-') # 在结尾,不需要转义
['a', 'c', '-']
3. 右括弧は最初からではなく角括弧内にあります。
>>> import re
>>> re.findall(r'[]ab]', ']ab') # 右括号不转义,在首位
[']', 'a', 'b']
>>> re.findall(r'[a]b]', ']ab') # 右括号不转义,不在首位
[] # 匹配不上,因为含义是 a后面跟上b]
>>> re.findall(r'[a\]b]', ']ab') # 转义后代表普通字符
[']', 'a', 'b']
一般に、メタ文字 (.*+?() など) を文字通りの意味で表現したい場合はエスケープする必要がありますが、文字グループ内の括弧内にある場合はエスケープしないでください。この場合、通常はドット (.)、アスタリスク (*)、プラス記号 (+)、疑問符 (?)、左括弧、右括弧などの単一長のメタ文字です。それらはすべて特別な意味を持たなくなり、キャラクターそのものを表します。ただし、\d や \w などの記号が角括弧内に表示されている場合でも、それらはメタキャラクター自体の意味を持ちます。
>>> import re
>>> re.findall(r'[.*+?()]', '[.*+?()]') # 单个长度的元字符
['.', '*', '+', '?', '(', ')']
>>> re.findall(r'[\d]', 'd12\\') # \w,\d等在中括号中还是元字符的功能
['1', '2'] # 匹配上了数字,而不是反斜杠\和字母d
この記事は8月のDay23の学習メモです 内容はGeek Time の「正規表現入門コース」ですお勧めのコースです。