Python 正規表現の概要

Jun 16, 2016 am 08:47 AM
python 正規表現

注: この記事は Python2.4 に基づいています。理解できない用語がある場合は、Baidu、Google、Wiki などを思い出してください。

1. 正規表現の基本
1.1. 簡単な紹介

正規表現は Python の一部ではありません。正規表現は、文字列を処理するための強力なツールです。独自の構文と独立した処理エンジンを備えています。str 独自のメソッドほど効率的ではないかもしれませんが、非常に強力です。このおかげで、正規表現の構文は、正規表現を提供する言語で同じになります。唯一の違いは、異なるプログラミング言語の実装によってサポートされる構文の数が異なることです。ただし、サポートされていない構文は通常は一部です。それは一般的には使用されません。すでに他の言語で正規表現を使用している場合は、ざっと確認するだけで使い始めることができます。

次の図は、正規表現を使用した照合プロセスを示しています。

re_simple

正規表現の大まかな照合プロセスは次のとおりです。 式とテキストを順に取り出し、比較します。すべての文字が一致する場合、一致は成功します。一致しない文字がある場合、一致は失敗します。式に量指定子や境界がある場合、プロセスは若干異なりますが、以下の図の例を見て、自分で何度か使用すると、簡単に理解できるようになります。

次の図は、Python でサポートされている正規表現のメタ文字と構文を示しています:

pyre

1.2 量指定子の貪欲モード-greedy pattern

正規表現は、テキスト内の一致する文字列を検索するためによく使用されます。 Python の量指定子はデフォルトで貪欲であり (一部の言語ではデフォルトで非貪欲)、常にできるだけ多くの非貪欲な文字と一致しようとします。逆に、常にできるだけ少ない文字と一致しようとします。たとえば、「abbbc」を検索するために正規表現「ab*」を使用すると、「abbb」が検索されます。また、貪欲でない量指定子「ab*?」を使用すると、「a」が見つかります。

1.3. バックスラッシュの問題

ほとんどのプログラミング言語と同様に、「"」は正規表現のエスケープ文字として使用され、バックスラッシュの問題を引き起こす可能性があります。テキスト内の文字「」と一致する必要がある場合、プログラミング言語で表現される正規表現には 4 つのバックスラッシュ「\\」が必要です。最初の 2 つと最後の 2 つは、プログラミング言語でバックスラッシュにエスケープするために使用され、変換されます。正規表現では 2 つのバックスラッシュに変換され、その後 1 つのバックスラッシュにエスケープされます。 Python のネイティブ文字列は、この問題を非常にうまく解決します。この例の正規表現は r"\" で表すことができます。同様に、数値に一致する「\d」は r"d" と書くことができます。ネイティブ文字列を使用すると、バックスラッシュの欠落を心配する必要がなくなり、作成する式がより直感的になります。

1.4. マッチング パターン

正規表現では、大文字と小文字の区別や複数行のマッチングなど、利用可能なマッチング パターンが提供されます。この部分は、パターンクラス(pattern[, flags])もまとめて紹介します。

2. re モジュール

2.1. re の使用を開始する

Python は re モジュールを通じて正規表現をサポートします。 re を使用するための一般的な手順は、まず正規表現の文字列形式を Pattern インスタンスにコンパイルし、次に Pattern インスタンスを使用してテキストを処理し、一致結果 (Match インスタンス) を取得し、最後に Match インスタンスを使用して情報を取得し、その他の操作を実行します。

コードをコピー コードは次のとおりです:

# エンコーディング: UTF-8
import re
#正規表現の変換 式を Pattern オブジェクトにコンパイルします。
pattern = re.compile(r'hello')
# Pattern を使用してテキストを照合し、一致しない場合は None が返されます match = pattern.match('hello world !')
if match:
# Match を使用してグループ情報を取得します
print match.group()
### 出力 ###
#こんにちは


re.compile(strPattern[, flag]):
このメソッドは、Pattern クラスのファクトリ メソッドであり、文字列形式の正規表現を Pattern オブジェクトにコンパイルするために使用されます。 2 番目のパラメーター フラグは、ビットごとの OR 演算子 '|' を使用して、同時に有効であることを示します (re.I | re.M)。さらに、正規表現文字列でパターンを指定することもできます。たとえば、re.compile('pattern', re.I | re.M) は re.compile('(?im)pattern') と同等です。
オプションの値は次のとおりです:
re.I(re.IGNORECASE): 大文字と小文字を無視します (完全な記述は括弧内にあります。以下同様)
M(MULTILINE): 複数行モード、変更 '^ ' と '$' の動作 (上の図を参照)
S(DOTALL): 一致するパターンをクリックして '.' の動作を変更します
L(LOCALE): 所定の文字クラスを作成します w W b B s S は現在のロケールに依存します
U(UNICODE): 所定の文字クラスを w W b B s S d D を Unicode で定義された文字属性に依存させます
X(VERBOSE): 冗長モード。このモードでは、正規表現を複数行にすることができ、空白文字は無視され、コメントを追加できます。次の 2 つの正規表現は同等です:
コードをコピー コードは次のとおりです:

a = re.compile(r """d + # 整数部
. # 小数点
d * # 一部の小数点""", re.X)
b = re.compile(r"d+.d *" )

は、正規表現関数を完成させるための多数のモジュール メソッドを提供します。これらのメソッドは、Pattern インスタンスの対応するメソッドで置き換えることができます。唯一の利点は、記述される re.compile() コードが 1 行少なくなることですが、同時にコンパイルされた Pattern オブジェクトを再利用することはできません。これらのメソッドは、Pattern クラスのインスタンス メソッド セクションでまとめて紹介されます。たとえば、上記の例は次のように省略できます:
コードをコピー コードは次のとおりです:

m = re。 match(r'hello' , 'hello world!')
print m.group()

re モジュールは、次のような文字列内の正規表現メタ文字用のメソッド escape(string) も提供します。 * /+/? の前にエスケープ文字を追加してから戻ります。これは、多数のメタ文字を一致させる必要がある場合に便利です。
2.2. Match
Match オブジェクトは一致の結果であり、Match が提供する読み取り可能なプロパティまたはメソッドを使用してこの情報を取得できます。
属性:
文字列: マッチング時に使用されるテキスト。
re: マッチングに使用されるパターン オブジェクト。
pos: 正規表現検索が開始されるテキスト内のインデックス。この値は、Pattern.match() メソッドおよび Pattern.seach() メソッドの同名のパラメータと同じです。
endpos: 正規表現検索が終了するテキスト内のインデックス。この値は、Pattern.match() メソッドおよび Pattern.seach() メソッドの同名のパラメータと同じです。
lastindex: テキスト内で最後にキャプチャされたグループのインデックス。パケットがキャプチャされなかった場合は None になります。
lastgroup: 最後にキャプチャされたグループのエイリアス。このグループにエイリアスがない場合、またはキャプチャされたグループがない場合は、None になります。
メソッド:
group([group1, …]):
1 つ以上のグループによってインターセプトされた文字列を取得します。複数のパラメーターが指定された場合は、タプルの形式で返されます。 group1 は数値またはエイリアスを使用できます。数値 0 は一致した部分文字列全体を表します。パラメータが入力されていない場合は、group(0) が返されます。回は、最後にインターセプトされた部分文字列を返します。
groups([default]):
すべてのグループのインターセプト文字列をタプルの形式で返します。 group(1,2,…last) を呼び出すことと同等です。デフォルトは、文字列をインターセプトしないグループがこの値に置き換えられることを意味し、デフォルトは None です。
groupdict([default]):
エイリアスのグループのエイリアスをキーとして、グループによってインターセプトされた部分文字列を値として持つ辞書を返します。エイリアスのないグループは含まれません。デフォルトの意味は上記と同じです。
start([group]):
指定されたグループによってインターセプトされた部分文字列の文字列内の開始インデックス (部分文字列の最初の文字のインデックス) を返します。グループのデフォルト値は 0 です。
end([group]):
文字列内の指定されたグループによってインターセプトされた部分文字列の終了インデックス (部分文字列の最後の文字のインデックス + 1) を返します。グループのデフォルト値は 0 です。
span([グループ]):
戻り値 (開始(グループ)、終了(グループ))。
expand(template):
一致したグループをテンプレートに入れて戻ります。 id または g、g を使用してテンプレート内のグループを参照できますが、数値 0 は使用できません。 id は g; と同等ですが、10 は 10 番目のグループとみなされます。1 の後に文字「0」が続くことを表現したい場合は、g<1>0 のみを使用できます。
コードをコピー コードは次のとおりです:

import re
m = re.match(r'(w+) (w+)(?P.*)', 'hello world!')
print "m.string :", m.string
print "m.re:", m.re
print "m.pos:", m.pos
print "m.endpos:", m.endpos
print "m.lastindex:", m.lastindex
print "m.lastgroup:", m.lastgroup
print "m.group(1,2):", m.group(1, 2)
print "m.groups():", m.groups()
print "m.groupdict():", m.groupdict()
print "m.start(2):", m.start(2)
print "m.end(2):", m.end(2)
print "m.span(2):", m.span(2)
print r"m.expand(r'2 13'):", m.expand(r'2 13')
### 出力 ###
# m.string: hello world!
# m.re:
# m.pos: 0
# m.endpos: 12
# m.lastindex: 3
# m.lastgroup: 符号
# m.group(1,2): ( 'hello', 'world')
# m.groups(): ('hello', 'world', '!')
# m.groupdict(): {'sign': '!'}
# m.start(2): 6
# m.end(2): 11
# m.span(2): (6, 11)
# m.expand(r' 2 13'): ワールドハロー!

2.3.パターン
パターン オブジェクトは、パターンが提供する一連の方法によってテキストの適合を実行できる、適切な表現形式です。 >パターンは、表現式を取得するために使用される、次の関連情報を提供します。
パターン: 評価時に使用される表現形式の文字列。
フラグ: 評価時に使用される適合モード。

groupindex: 表式内に名前が含まれるグループの名前はセキュリティであり、そのグループに対応する番号は値の文字典であり、そのグループには名前は含まれません。


复制代码
代码如下: import re p = re.compile(r'(w+) (w+)(? P.*)', re.DOTALL)
print "p.pattern:", p.pattern
print "p.flags:", p.flags
print "p.groups: ", p.groups
print "p.groupindex:", p.groupindex
### Output ###
# p.pattern: (w+) (w+)(?P. *)
# p.flags: 16
# p.groups: 3
# p.groupindex: {'sign': 3}



实例方法[ | re模块方法]:
1、match(string[, pos[, endpos]]) | re.match(pattern, string[, flags]): このメソッドは、文字列の位置の下にあるパターンを呼び出します。一致パターンが完了した場合、一致可能です。一致オブジェクトが返されます。一致途中のパターンであれば、
pos と endpos の指定値はそれぞれ 0 と len(string) です。re.match() はこの 2 つのパラメータを指定できません。パラメータflags は、
注意: この方法は完全な一致ではありません。パターンの終了時に文字列に残りの文字があれば成功とみなされます。
2.1 の例を参照してください。
2、search(string[, pos[, endpos]]) | re.search(pattern, string[, flags]):
このメソッドは、文字列内で一致する可能性がある子列を検索するために使用されます。パターンの終了時に一致する場合、文字列の pos の下から一致パターンを開始します。
pos と endpos の値は、それぞれ 0 と len(string) です。
pos と endpos の値は、それぞれ 0 と len(string) です。 );re.search() はこの 2 つのパラメータを無法で指定し、パラメータフラグはパターンの一致モードを指定するために使用されます。 >

# エンコーディング: UTF-8
import re
# 将正则表达式编译成パターン对象 pattern = re.compile(r'world') # usesearch () 查找適合の子串、存在しない能適合の子串の場合は返しません # この例では match() 無法成功適合 match = pattern.search('hello world!') if match:
# 使用Match获得分组情報
print match.group()
### 出力 ###
# world


3、split(文字列[, maxsplit]) | re.split(pattern, string[, maxsplit]):
一致する子列を文字列分割した後、列表を返します。maxsplit は最大分割次数を指定するために使用され、全体分割は指定されません。 🎜>
复制代码

代码如下:


import re p = re.compile(r'd+')
print p.split(' one1two2three3four4')
### 出力 ###
# ['one', 'two', 'three', 'four', '']
4、findall(文字列[, pos[, endpos]]) | re.findall(pattern, string[, flags]): 検索文字列、リスト形式ですべての能力に適合する子列が返されます。代コード如下:
import re
p = re.compile(r'd+')
print p.findall('one1two2three3four4')
### 出力 ###
# ['1', '2', '3', '4']


5. finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags]):
文字列を検索し、一致する各結果への順次アクセスを返します (Match オブジェクト)イテレータ。
コードをコピー コードは次のとおりです。

import re
p = re.compile(r'd+' )
for m in p.finditer('one1two2three3four4'):
print m.group(),
### 出力 ###
# 1 2 3 4

6. sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]):
repl を使用して、string 内の一致する各部分文字列を置換し、置換された文字列を返します。
repl が文字列の場合、id または g、g を使用してグループを参照できますが、数値 0 は使用できません。
repl がメソッドの場合、このメソッドは 1 つのパラメータ (Match オブジェクト) のみを受け取り、置換用の文字列を返す必要があります (返された文字列でグループを参照することはできません)。
count は置換の最大数を指定するために使用されます。指定しない場合は、すべての置換が行われます。
コードをコピー コードは次のとおりです。

import re
p = re.compile(r'(w+ ) (w+ )')
s = 'こんにちは、世界!'
print p.sub(r'2 1', s)
def func(m):
return m. group(1 ).title() + ' ' + m.group(2).title()
print p.sub(func, s)
### 出力 ###
# Say i 、ワールドハロー!
# こんにちは、ワールド!

7. subn(repl, string[, count]) |re.sub(pattern, repl, string[, count]) :
Return (sub(repl, string[, count]), 置換数)。
コードをコピー コードは次のとおりです。

import re
p = re.compile(r'(w+ ) (w+ )')
s = 'こんにちは、世界!'
print p.subn(r'2 1', s)
def func(m):
return m. group(1 ).title() + ' ' + m.group(2).title()
print p.subn(func, s)
### 出力 ###
# (' Say i, world hello!', 2)
# ('I Say, Hello World!', 2)

上記は Python の正規表現のサポートです。正規表現に習熟することは、すべてのプログラマーが備えなければならないスキルです。現在、文字列を扱わないプログラムはありません。筆者もまだまだ初期段階ですが、頑張ってください^_^
なお、図には特殊な構造の例が無く、これらの正規表現の使い方が難しいです。興味があれば、abc で始まらない単語を一致させる方法を考えてみてください ^_^
全文終わり
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

mysqlは支払う必要がありますか mysqlは支払う必要がありますか Apr 08, 2025 pm 05:36 PM

MySQLには、無料のコミュニティバージョンと有料エンタープライズバージョンがあります。コミュニティバージョンは無料で使用および変更できますが、サポートは制限されており、安定性要件が低く、技術的な能力が強いアプリケーションに適しています。 Enterprise Editionは、安定した信頼性の高い高性能データベースを必要とするアプリケーションに対する包括的な商業サポートを提供し、サポートの支払いを喜んでいます。バージョンを選択する際に考慮される要因には、アプリケーションの重要性、予算編成、技術スキルが含まれます。完璧なオプションはなく、最も適切なオプションのみであり、特定の状況に応じて慎重に選択する必要があります。

PSフェザーリングは、遷移の柔らかさをどのように制御しますか? PSフェザーリングは、遷移の柔らかさをどのように制御しますか? Apr 06, 2025 pm 07:33 PM

羽毛の鍵は、その漸進的な性質を理解することです。 PS自体は、勾配曲線を直接制御するオプションを提供しませんが、複数の羽毛、マッチングマスク、および細かい選択により、半径と勾配の柔らかさを柔軟に調整して、自然な遷移効果を実現できます。

インストール後にMySQLの使用方法 インストール後にMySQLの使用方法 Apr 08, 2025 am 11:48 AM

この記事では、MySQLデータベースの操作を紹介します。まず、MySQLWorkBenchやコマンドラインクライアントなど、MySQLクライアントをインストールする必要があります。 1. mysql-uroot-pコマンドを使用してサーバーに接続し、ルートアカウントパスワードでログインします。 2。CreatedAtaBaseを使用してデータベースを作成し、データベースを選択します。 3. createTableを使用してテーブルを作成し、フィールドとデータ型を定義します。 4. INSERTINTOを使用してデータを挿入し、データをクエリし、更新することでデータを更新し、削除してデータを削除します。これらの手順を習得することによってのみ、一般的な問題に対処することを学び、データベースのパフォーマンスを最適化することでMySQLを効率的に使用できます。

PSフェザーリングをセットアップする方法は? PSフェザーリングをセットアップする方法は? Apr 06, 2025 pm 07:36 PM

PSフェザーリングは、イメージエッジブラー効果であり、エッジエリアのピクセルの加重平均によって達成されます。羽の半径を設定すると、ぼやけの程度を制御でき、値が大きいほどぼやけます。半径の柔軟な調整は、画像とニーズに応じて効果を最適化できます。たとえば、キャラクターの写真を処理する際に詳細を維持するためにより小さな半径を使用し、より大きな半径を使用してアートを処理するときにかすんだ感覚を作成します。ただし、半径が大きすぎるとエッジの詳細を簡単に失う可能性があり、効果が小さすぎると明らかになりません。羽毛効果は画像解像度の影響を受け、画像の理解と効果の把握に従って調整する必要があります。

MySQLダウンロードファイルが破損しており、インストールできません。修復ソリューション MySQLダウンロードファイルが破損しており、インストールできません。修復ソリューション Apr 08, 2025 am 11:21 AM

mysqlダウンロードファイルは破損していますが、どうすればよいですか?残念ながら、MySQLをダウンロードすると、ファイルの破損に遭遇できます。最近は本当に簡単ではありません!この記事では、誰もが迂回を避けることができるように、この問題を解決する方法について説明します。それを読んだ後、損傷したMySQLインストールパッケージを修復するだけでなく、将来の行き詰まりを避けるために、ダウンロードとインストールプロセスをより深く理解することもできます。最初に、ファイルのダウンロードが破損した理由について話しましょう。これには多くの理由があります。ネットワークの問題は犯人です。ダウンロードプロセスの中断とネットワーク内の不安定性は、ファイル腐敗につながる可能性があります。ダウンロードソース自体にも問題があります。サーバーファイル自体が壊れており、もちろんダウンロードすると壊れています。さらに、いくつかのウイルス対策ソフトウェアの過度の「情熱的な」スキャンもファイルの破損を引き起こす可能性があります。診断問題:ファイルが本当に破損しているかどうかを判断します

MySQLはダウンロード後にインストールできません MySQLはダウンロード後にインストールできません Apr 08, 2025 am 11:24 AM

MySQLのインストール障害の主な理由は次のとおりです。1。許可の問題、管理者として実行するか、SUDOコマンドを使用する必要があります。 2。依存関係が欠落しており、関連する開発パッケージをインストールする必要があります。 3.ポート競合では、ポート3306を占めるプログラムを閉じるか、構成ファイルを変更する必要があります。 4.インストールパッケージが破損しているため、整合性をダウンロードして検証する必要があります。 5.環境変数は誤って構成されており、環境変数はオペレーティングシステムに従って正しく構成する必要があります。これらの問題を解決し、各ステップを慎重に確認して、MySQLを正常にインストールします。

MySQLインストール後にデータベースのパフォーマンスを最適化する方法 MySQLインストール後にデータベースのパフォーマンスを最適化する方法 Apr 08, 2025 am 11:36 AM

MySQLパフォーマンスの最適化は、インストール構成、インデックス作成、クエリの最適化、監視、チューニングの3つの側面から開始する必要があります。 1。インストール後、INNODB_BUFFER_POOL_SIZEパラメーターやclose query_cache_sizeなど、サーバーの構成に従ってmy.cnfファイルを調整する必要があります。 2。過度のインデックスを回避するための適切なインデックスを作成し、説明コマンドを使用して実行計画を分析するなど、クエリステートメントを最適化します。 3. MySQL独自の監視ツール(ShowProcessList、ShowStatus)を使用して、データベースの健康を監視し、定期的にデータベースをバックアップして整理します。これらの手順を継続的に最適化することによってのみ、MySQLデータベースのパフォーマンスを改善できます。

高負荷アプリケーションのMySQLパフォーマンスを最適化する方法は? 高負荷アプリケーションのMySQLパフォーマンスを最適化する方法は? Apr 08, 2025 pm 06:03 PM

MySQLデータベースパフォーマンス最適化ガイドリソース集約型アプリケーションでは、MySQLデータベースが重要な役割を果たし、大規模なトランザクションの管理を担当しています。ただし、アプリケーションのスケールが拡大すると、データベースパフォーマンスのボトルネックが制約になることがよくあります。この記事では、一連の効果的なMySQLパフォーマンス最適化戦略を検討して、アプリケーションが高負荷の下で効率的で応答性の高いままであることを保証します。実際のケースを組み合わせて、インデックス作成、クエリ最適化、データベース設計、キャッシュなどの詳細な主要なテクノロジーを説明します。 1.データベースアーキテクチャの設計と最適化されたデータベースアーキテクチャは、MySQLパフォーマンスの最適化の基礎です。いくつかのコア原則は次のとおりです。適切なデータ型を選択し、ニーズを満たす最小のデータ型を選択すると、ストレージスペースを節約するだけでなく、データ処理速度を向上させることもできます。

See all articles