正規表現の構文規則
- 詳細については、
「[Java の基礎] 正規表現アプリケーション」を参照してください。
再モジュール
正規表現は、文字列を照合するための強力な武器です。その設計思想は、記述言語を使用して文字列のルールを定義することです。ルールに準拠する文字列はすべて「一致」とみなされます。それ以外の場合、文字列は不正です。
- 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 オブジェクトを返し、そうでない場合はNon
e を返します。
使用
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')