[Python] 入門から上級まで — re モジュールを使用して正規表現要件を迅速に実装する (11)

正規表現の構文規則

再モジュール

正規表現は、文字列を照合するための強力な武器です。その設計思想は、記述言語を使用して文字列のルールを定義することです。ルールに準拠する文字列はすべて「一致」とみなされます。それ以外の場合、文字列は不正です。

  • Python は、すべての正規表現関数を含む re モジュールを提供します。Python の文字列自体も使用されるため\转义、次の点に特別な注意を払う必要があります。
s = 'ABC\\-001' # Python的字符串
# 对应的正则表达式字符串变成:
# 'ABC\-001'

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

s = r'ABC\-001' # Python的字符串
# 对应的正则表达式字符串不变:
# 'ABC\-001'

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

import  re

a = re.match(r'^\d{3}\-\d{3,8}$', '010-12345')
print(a)
b = re.match(r'^\d{3}\-\d{3,8}$', '010 12345')
print(b)

match() メソッドは一致があるかどうかを判断し、一致した場合は Match オブジェクトを返し、そうでない場合はNone を返します。

使用

import re

test = '用户输入的字符串'
if re.match(r'正则表达式', test):
    print('ok')
else:
    print('failed')

文字列を分割する

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

c = 'a b   c'.split(' ')
print(c)
#['a', 'b', '', '', 'c']
  • 連続したスペースは認識されません

通常のセグメンテーション

d = re.split(r'\s+', 'a b   c')
print(d)
#['a', 'b', 'c']

スペースがいくつあっても正常に分割できます。参加してみてください,:

e = re.split(r'[\s\,]+', 'a,b, c  d')
print(e)
#['a', 'b', 'c', 'd']

もう一度追加してみてください;:

f = re.split(r'[\s\,\;]+', 'a,b;; c  d')
print(f)
#['a', 'b', 'c', 'd']

グループ

正規表現には、単純に一致があるかどうかを判断するだけでなく、提取子串強力な機能もあります。で表されるもの()が抽出されるものです分组(Group)

  • 例: ^(\d{3})-(\d{3,8})$2 つのグループがそれぞれ定義されており、一致する文字列から直接抽出できます区号和本地号码
g = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
print(g.group(0))
print(g.group(1))
print(g.group(2))
#010-12345
#010
#12345

正規表現でグループが定義されている場合は、Match オブジェクトを使用してgroup()方法部分文字列を抽出できます。

  • group(1)、group(2)... は 1 番目、2 番目、... の部分文字列を表すことに注意してくださいgroup(0)永远是与整个正则表达式相匹配的字符串

部分文字列を抽出するのに非常に便利です。もっと残酷な例を見てみましょう:

h = '19:05:30'
m =  re.match(r'^(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])$',h)
print(m.groups())
#('19', '05', '30')

この正規表現により、法定時刻を直接識別できます。ただし、日付の識別など、正規表現を使用して完全な検証を達成できない場合があります。

'^(0[1-9]|1[0-2]|[0-9])-(0[1-9]|1[0-9]|2[0-9]|3[0-1]|[0-9])$'

このような不正な日付については'2-30','4-31'、依然として正規表現による識別が不可能であるか、書き出すことが非常に困難であるため、現時点では識別に連携するプログラムが必要となる。

貪欲なマッチング

Python で正規表現を使用する場合、re モジュールは内部で 2 つのことを行います。

  • 正規表現をコンパイルします。正規表現の構文が不正な場合は、エラーが報告されます。
  • コンパイルされた正規表現を使用して文字列を照合します。

正規表現を何千回も再利用する場合、効率を高めるために正規表現をプリコンパイルすると、再利用時にこの手順をコンパイルする必要がなく、直接一致します。

# 编译:
re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')
# 使用:
a2 = re_telephone.match('010-12345').groups()
print(a2)
# ('010', '12345')
a3 = re_telephone.match('010-8086').groups()
print(a3)
# ('010', '8086')

おすすめ

転載: blog.csdn.net/qq877728715/article/details/132833894