Pythonで正規表現を使う方法

爱喝马黛茶的安东尼
リリース: 2019-06-22 13:20:21
オリジナル
2341 人が閲覧しました

文字列はプログラミングで最も一般的に使用されるデータ構造であり、文字列を操作する必要がある場所はほとんどどこでもあります。例えば、ある文字列が正当なメールアドレスかどうかを判断する場合、@の前後の部分文字列をプログラム的に抽出して単語かドメイン名かを判断することはできますが、面倒なだけでなく再利用も困難です。コード。正規表現は、文字列を照合するための強力な武器です。その設計思想は、記述言語を使用して文字列のルールを定義することです。ルールに準拠する文字列はすべて「一致」とみなされます。それ以外の場合、文字列は不正です。

Pythonで正規表現を使う方法

したがって、文字列が正当な電子メールであるかどうかを判断する方法は次のとおりです:

Email に一致する正規表現を作成します;

Useこの正規表現をユーザーの入力と照合して、それが正当かどうかを判断します。

正規表現は文字列でも表されるため、まず文字を使用して文字を記述する方法を理解する必要があります。

正規表現では、文字を直接指定すると完全一致となります。数字と一致させるには \d を使用し、文字または数字と一致させるには \w を使用します。つまり、

'00\d' は '007' と一致しますが、'00A' と一致することはできません。 \d\d\d' は '010' に一致します;

'\w\w\d' は 'py3' に一致します;

. は任意の文字に一致するため、次のようになります:

'py.' は、'pyc'、'pyo'、'py!' などと一致します。

正規表現で可変長文字を一致させるには、任意の数の文字 (0 を含む) を表すには * を使用し、少なくとも 1 つの文字を表すには を使用し、0 または 1 文字を表すには ? を使用し、{ n } は n 文字を表し、{n,m} は n-m 文字を表します:

複雑な例を見てみましょう: \d{3}\s \d{3,8}。

左から右に解釈してみましょう:

\d{3} は、「010」などの 3 つの数字と一致することを意味します。

\s はスペースと一致することもあります (タブやその他の空白文字が含まれます)、\s は、「 」、「 」などの一致など、少なくとも 1 つのスペースを意味します。

\d{3,8} は、次のような 3 ~ 8 個の数字を意味します。 '1234567' 。

まとめると、上記の正規表現は、任意の数のスペースで区切られた市外局番を持つ電話番号を照合できます。

「010-12345」のような番号を照合したい場合はどうすればよいですか? 「-」は特殊文字であるため、正規表現では「\」を使用してエスケープする必要があるため、上記の正規表現は \d{3}\-\d{3,8} となります。

ただし、「010 - 12345」はスペースがあるため依然として一致できません。したがって、より複雑なマッチング方法が必要になります。

関連する推奨事項: 「

Python ビデオ チュートリアル

上級

より正確に一致させるには、[ ] は範囲を表します。例:

[0-9a-zA-Z\_] は数字、文字、またはアンダースコアに一致します;

[0-9a-zA-Z\_ ] can 'a100'、'0_Z'、'Py3000' など、少なくとも 1 つの数字、文字、またはアンダースコアで構成される文字列と一致します;

[a-zA-Z\_][0 -9a-zA -Z\_]* は、文字またはアンダースコアで始まり、その後に数字、文字、またはアンダースコアで構成される任意の数の文字列が続く文字列と一致します。これは Python の有効な変数です。

[a-zA-Z\ _][0-9a-zA-Z\_]{0, 19} は、変数の長さをより正確に 1 ~ 20 文字に制限します (最初の文字以降は最大 19 文字)キャラクター)。

A|B は A または B と一致するため、(P|p)ython は「Python」または「python」と一致します。

##^ は行の先頭を意味し、^\d は数字で始まらなければならないことを意味します。

$ は行の終わりを示し、\d$ は数字で終わる必要があることを示します。

py は 'python' とも一致することに気づいたかもしれませんが、^py$ を追加すると行全体の一致になるため、'py' とのみ一致します。

re module

準備知識があれば、Python で正規表現を使用できます。 Python は、すべての正規表現関数を含む re モジュールを提供します。 Python の文字列自体も \ でエスケープされるため、特別な注意を払う必要があります:

s = 'ABC\\-001' # Python の文字列 # 対応する正規表現文字列は次のようになります: # ' ABC\-001'

したがって、エスケープを心配する必要がないように、Python の r プレフィックスを使用することを強くお勧めします。

s = r'ABC\-001' # Python 対応する文字列 # # 'ABC\-001'

まず、正規表現が一致するかどうかを判断する方法を見てみましょう。

>>> import re
>>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345')
<_sre.SRE_Match object; span=(0, 9), match=&#39;010-12345&#39;
>>>> re.match(r&#39;^\d{3}\-\d{3,8}$&#39;, &#39;010 12345&#39;)
>>>
ログイン後にコピー

match( ) メソッドは、次のとおりであるかどうかを判断します。一致があれば Match オブジェクトを返し、それ以外の場合は None を返します。一般的な判定方法は、

test = 'ユーザーが入力した文字列'if re.match(r'正規表現', test):

print(&#39;ok&#39;)else:
print(&#39;failed&#39;)
ログイン後にコピー


cut文字列の分割

正規表現を使用して文字列を分割することは、固定文字を使用するよりも柔軟です。通常の分割コードを参照してください:

>>> &#39;a b   c&#39;.split(&#39; &#39;)
[&#39;a&#39;, &#39;b&#39;, &#39;&#39;, &#39;&#39;, &#39;c&#39;]
ログイン後にコピー

まあ、連続したスペースは認識できません。 を使用してみてください。正規表現:

>>> re.split(r&#39;\s+&#39;, &#39;a b   c&#39;)
[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;]
ログイン後にコピー

スペースがいくつあっても正常に分割できます。参加、試行:

>>> re.split(r&#39;[\s\,]+&#39;, &#39;a,b, c  d&#39;)
[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;]
ログイン後にコピー

再度参加; 試行:

>>> re.split(r&#39;[\s\,\;]+&#39;, &#39;a,b;; c  d&#39;)
[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;]
ログイン後にコピー

ユーザーが一連のタグを入力する場合は、次回配列するときに正規表現を使用して不規則な入力を正しい入力に変換することを忘れないでください。 #########グループ######

除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group)。比如:

^(\d{3})-(\d{3,8})$分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码:

>>> m = re.match(r&#39;^(\d{3})-(\d{3,8})$&#39;, &#39;010-12345&#39;)
>>> m
<_sre.SRE_Match object; span=(0, 9), match=&#39;010-12345&#39;
>>>> m.group(0)&#39;010-12345&#39;
>>> m.group(1)&#39;010&#39;
>>> m.group(2)&#39;12345&#39;
ログイン後にコピー

如果正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串来。

注意到group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串。

提取子串非常有用。来看一个更凶残的例子:

>>> t = &#39;19:05:30&#39;
>>> m = re.match(r&#39;^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$&#39;, t)>>> m.groups()
(&#39;19&#39;, &#39;05&#39;, &#39;30&#39;)
ログイン後にコピー

这个正则表达式可以直接识别合法的时间。但是有些时候,用正则表达式也无法做到完全验证,比如识别日期:

&#39;^(0[1-9]|1[0-2]|[0-9])-(0[1-9]|1[0-9]|2[0-9]|3[0-1]|[0-9])$&#39;
ログイン後にコピー

对于'2-30','4-31'这样的非法日期,用正则还是识别不了,或者说写出来非常困难,这时就需要程序配合识别了。

贪婪匹配

最后需要特别指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。举例如下,匹配出数字后面的0:

>>> re.match(r&#39;^(\d+)(0*)$&#39;, &#39;102300&#39;).groups()
(&#39;102300&#39;, &#39;&#39;)
ログイン後にコピー

由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。

必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配:

>>> re.match(r&#39;^(\d+?)(0*)$&#39;, &#39;102300&#39;).groups()
(&#39;1023&#39;, &#39;00&#39;)
ログイン後にコピー

编译

当我们在Python中使用正则表达式时,re模块内部会干两件事情:

编译正则表达式,如果正则表达式的字符串本身不合法,会报错;

用编译后的正则表达式去匹配字符串。

如果一个正则表达式要重复使用几千次,出于效率的考虑,我们可以预编译该正则表达式,接下来重复使用时就不需要编译这个步骤了,直接匹配:

>>> import re
# 编译:
>>> re_telephone = re.compile(r&#39;^(\d{3})-(\d{3,8})$&#39;)
# 使用:
>>> re_telephone.match(&#39;010-12345&#39;).groups()
(&#39;010&#39;, &#39;12345&#39;)
>>> re_telephone.match(&#39;010-8086&#39;).groups()
(&#39;010&#39;, &#39;8086&#39;)
ログイン後にコピー

编译后生成Regular Expression对象,由于该对象自己包含了正则表达式,所以调用对应的方法时不用给出正则字符串。

参数

Pythonで正規表現を使う方法

修饰符

Pythonで正規表現を使う方法

模式

Pythonで正規表現を使う方法

Pythonで正規表現を使う方法

以上がPythonで正規表現を使う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート