正規表現でエスケープする

エスケープ シーケンスは通常、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 の「正規表現入門コース」ですお勧めのコースです。

おすすめ

転載: blog.csdn.net/key_3_feng/article/details/132462417