正規表現は、多くの場合、このようなデータ(フォーマット)認証、コンテンツ置換文字列として、プログラム開発に使用されると状況が使用されますので、内容を抽出されますが、唯一の基本的な理解や意思で正規表現のために、今、多くの開発者舞台で。状況たら遭遇した正規表現を使用して大量に(例えばウェブクローラなど)は、基本的にバランスをオフにスローということができます。この記事では、私はPythonの正規表現の使用について学ぶために行くことができます。この記事を読む前に、あなたは基本的にそれぞれの言語が類似している方法で正規表現を使用しているため、パイソンの基本をマスターし、あるいは他の言語の基本的な知識をも開発することができますする必要があります。
ゼロ、正規表現の基礎
- 文字(文字列)を抽出
時には我々は、文字列からのコンテンツの一部を取得する必要があり、このコンテンツは文字も、文字列であることかもしれない、文字通り場合は、トラバースコントラスト、時間がかかるだけでなく、エラーを起こしやすいです。さて、今回は、正規表現を使用することができます文字マッチング機能を。次のように正規表現は、私たちのために4つの文字を一致させるための方法を提供します。
文法 | 説明 | 例 | 文字列の一致 |
---|---|---|---|
。 | で改行以外の任意の文字にマッチ「\ n」は | AB | ACB、ADB、A2B、〜B |
\ | 本来の意味を変更する文字の後に文字を転送するために、エスケープ | [B \。\\] C | ABC、AC、\ C |
[] | 括弧内の任意の文字に一致します | [B、C、D、E] F | ABD、ACF、ADF、AEF |
[^] | カッコ内の文字に加えて、他の文字が一致します | [^、B、C、D、E] F | A1F、#Fを、AZF、AGF |
- 事前定義された文字の
文字は、事前に定義された文字は、私たちの、具体的な数字とのマッチングなど、コンテンツの書式設定と一致するように設計された予約済みの正規表現であると呼ばれる\ dは空白とマッチング\ sの、というように。私たちは、すぐに事前に定義された文字の使用の要件を満たすために、文字列の内容を一致させることができます。事前定義されたコンテンツが文字にマッチ、また方法で使用することと同じ缶は、以前話された文字は、試合を一致しますが、コードの量は比較的少ないです。表に記載されている事前定義された文字です。
文法 | 説明 | 例 | 文字列の一致 |
---|---|---|---|
^ | どのような文字列で始まりました | ^ 123 | 123ABC、123321,123zxc |
$ | どのように文字列の末尾 | 123 $ | abc123,321123、zxc123 |
\ B | 単語の境界と一致して、任意の文字に一致しません | \ basd \ B | ASD |
\ dは | マッチ0-9 | ZX \ DC | zx1c、zx2c、zx5c |
\ D | 非数値のマッチング | ZX \ Dcの | zxvc、ZX $ C、ZX&C |
\ sの | マッチ空白 | ZX \ SC | ZX C |
\ S | 非空白文字をマッチング | ZX \のSc | zxac、zx1c、zxtc |
\ワット | 文字、数字、アンダースコアを一致させます | ZX \ C | zxdc、zx1c、zx_c |
\ W | 非一致文字、数字、アンダースコア | ZX \ Wcの | ZX C ZX $ C ZX(C |
次の点に注意してください。事前に定義された文字があります。
- \ Bは一の位置と一致し、この位置の一方の側は、単語、文字列の非単語の文字の開始または終了の他の側面を構成する文字です。\ Bはゼロ幅です。
- \異なるコード言語のW一致範囲は同じではない、言語がASCIIコードと一致している[-ZA-Z0-9_]、およびUnicode言語コードと一致する[座であります-Z0-9_]や漢字、全角記号やその他の特殊文字。
- 数量
我々は重複したコンテンツと一致する必要がありますいくつかのケースでは、我々は使用することができます定義された多数のモード動作を。番号は、以下の表を定義します。
文法 | 説明 | 例 | 文字列の一致 |
---|---|---|---|
* | 試合に0回 | ZXC * | ZX、zxccccc |
+ | 試合に1を複数回 | ZXC + | ZXC、zxccccc |
? | マッチ0または1 | ZXC? | ZXC、ZX |
{M} | マッチm回 | ZXC {3}、等 | zxcccvb |
{M} | マッチメートル回以上 | ZXC {3}、等 | zxcccvb、zxccccccccvb |
{N} | 0〜n回にマッチ | ZXC {3}、等 | zxvb、zxcvb、zxccvb、zxcccvb |
{M、N} | 一致n回回m個 | {1.3} ZXC | zxcvb、zxccvb、zxcccvb |
- アサーション
にも一致がときに真であったが、表明式の内容と一致しない場合に表明式を参照すると、ゼロ幅アサーションとして知らアサーション。そして最後に、^ $代表、始まりに、\ bが先頭と末尾アサーションアサーションとして単語境界は、同様の効果があり、彼らがゼロ幅と呼ばれるキャラクターを、取ることはありません、マッチング処理にのみ、特定の場所と一致して表します。いわゆる場所は、文字列の最初の文字、真ん中と最後の文字の右隣の文字の左側を指します。4ゼロ幅アサーション式があります。
- アサーションの後に作られたゼロ幅の負の見直し(?<!EXP)、式は成立と一致しない場合に保持していない主張の背後に位置を合わせます。例えば、\ W + \ D、ZXC一致する文字列が終了していない(<ZXC?)。
- 最初のゼロ幅の負のアサーション(?!経験)を想起し、発現が確立と一致しない、以前のアサーションの位置と一致しています。たとえば:\ D \ + wは、文字列と一致することはZXCで起動しません。(ZXC?!)
- (?= EXP)(?= gular)まず、アサーション、アサーションは、アサーションの前で真のマッチング位置で、例えば、追撃マッチ「正規表現」の正規再で、この文字列には、我々は再書き込みすることができます。
- アサーション後の髪(?<= EXP)、アサーションは、例えば、アサーションの背後にある真の一致位置であり、正規表現と定期的な再加算を一致させるために、文字列「egexは、正規表現を表して」、あなたは再使用することができます(?!G )この式は、これは、文字Gの背後に位置しない場合、再右の位置を定義します。プリおよびポスト髪の違いは、括弧内の式かどうか試合後の文字の位置ということです。
- 欲/非貪欲
正規表現は貪欲、貪欲正規表現パターンは、デフォルトモードであると呼ばれている文字に可能な限り一致します。しかし、時には貪欲な弾力私たちは、例えば、我々は文字列「Jack123Chen」の「Jack123Chen123Chen」と一致したいのですが、欲のパターンマッチングのうち、「Jack123Chen123Chen」で、不必要な苦痛を引き起こし、その後、我々は非欲張りを使用する必要があります次のようにモードがこの問題を解決するために、非欲張りモード一般的に使用される式は次のとおりです。
文法 | 説明 |
---|---|
*? | 可能な限り0以上、あまり重複を一致させます |
+? | 可能な限り1回以上一致するが、あまり重複 |
?? | 可能な限り0または1が、あまり重複を一致させます |
{M}? | マッチのM回以上、あまり重複可能な限り |
{M、N}? | 可能ですが、あまりの繰り返し限り、m回またはn回にマッチ |
- 他の
あなたの正規表現の内容は、一般的に使用されていないで、見てみましょうを使用しますが、同じ強力な構文されています。
- ORマッチング、我々は同様の開発に使用することもマッチングブランチ、長い試合でも一致している限り、その枝、およびORステートメントとして知られています。OR使用をマッチング|スプリット分岐が、例えば、私たちは英語で名前と一致する必要がありますが、分裂・英語のミドルネームと姓が可能で、スペース区切りがあるかもしれませんし、我々は使用して、この問題に対処するために一致させることができます。フォーマットは、次のされます。[A-Za-z] +・[A-ZA-Z] + | [A-ZA-Z] + \ S [A-ZA-Z] +
- ?組み合わせは、いくつかの項目は1つのユニット、缶* +に統合されます|そして、変更する他の記号、文字列、およびこの組み合わせは、使用の参照を提供するためにその試合の待ち時間を思い出すことができます。図の使用パケット()。そのようなアクセス日時として正規表現を書くことができる:\ D {4} - (0 [1-9] | 1 [0-2]) - (0 [1-9] | [12] [0-9] | 3 [01])。最初のパケット(0 [1-9] | 1 [0-2])は、第2のパケット(0 [1-9]、定期的な一致の月| [12] [0-9] | 3 [01] )は、通常の試合の日を表します。
A、Pythonは正規表現を使用して
Pythonで正規表現を使用して、非常にシンプルであるレ・モジュールは、正規表現のためのサポートを提供してくれます。手順を使用して、3段階の合計:
- 正規表現文字列の変換パターンのインスタンスを、
- 使用処理に整合するパターン例の文字は、照合結果が一致インスタンス。
- 次の例を使用して操作を実行するために一致しています。
Pythonでは、私たちは、6があり、再の方法を使用し、すなわち:コンパイル、マッチ、検索、のfindAll、スプリットとサブは、このために以下の説明は、6つのメソッドについてのだろう。
- コンパイル
役割はコンパイル方法パターン例に正規表現文字列である、を有する二つのパラメータのパターンとフラグは、パターン文字列のタイプは、正規表現文字列を受信したパラメータタイプは、あるフラグ・タイプはintは、受信した、ありますパターンマッチングの数であり、フラグ非必須パラメータは、デフォルト値は0(無視)されます。フラグマッチパターン6は、以下があります。
マッチモード | 説明 |
---|---|
re.I | ケースを無視 |
re.M | 複数行マッチモード |
re.S | 任意の一致モード |
re.L | 事前に定義された文字のマッチングパターン |
re.U | パターンマッチング文字を定義します |
re.V | 冗長モード |
6モードはめったに実際の開発で使用されていないことができ、私たちは知っている必要があります。次のように使用することは、非常に単純なコンパイルします。
import re
pattern = re.compile(r'\d')
- 一致し
、パターンの例を使用して一致アクションを復帰なしに一致しない場合、一致は、マッチのインスタンスを返すように場合は、文字列に一致するように左側から始めます。
import re
def getMatch(message):
pattern = re.compile(r'(\d{4}[-年])(\d{2}[-月])(\d{2}日{0,1})')
match = re.match(pattern, message)
if match:
print(match.groups())
for item in match.groups():
print(item)
else:
print("没匹配上")
if __name__ == '__main__':
message = "2019年01月23日大会开始"
getMatch(message)
message = "会议于2019-01-23召开"
getMatch(message)
我々は、コード使用グループこの方法は、文字列のマッチングを得るために使用される、方法。ここしばらくそこにコンテンツの最初の部分は、日付を一致させることができる理由多くの読者が疑問に思っている、とコンテンツの第2部分は行うことはできませんか?試合は、文字列の開始位置からマッチング法されているためです。図コードの実行結果:
- search
search 方法与 match 方法功能是一样的,只不过 search 方法是对整个字符串进行匹配。将前一小节代码中的 getMatch 方法进行改动,即可将第二段内容中的年月日匹配出来。
import re
def getMatch(message):
pattern = re.compile(r'(\d{4}[-年])(\d{2}[-月])(\d{2}日{0,1})')
match = re.search(pattern, message)
if match:
print(match.groups())
for item in match.groups():
print(item)
else:
print("没匹配上")
if __name__ == '__main__':
message = "2019年01月23日大会开始"
getMatch(message)
message = "会议于2019-01-23召开"
getMatch(message)
上述代码运行结果如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VmTrXNxa-1575984679614)(https://s2.ax1x.com/2019/12/03/QQ8fR1.png)]
4. findall
findall 方法的作用是匹配整个字符串,以列表的形式返回所有匹配结果。
import re
def getMatch(message):
pattern = re.compile(r'\w+')
match = re.findall(pattern, message)
if match:
print(match)
else:
print("没匹配上")
if __name__ == '__main__':
message = "my name is 张三"
getMatch(message)
message = "张三 is me"
getMatch(message)
代码运行结果如下图:
5. split
split 方法是利用指定的字符来分割字符串。
import re
def getMatch(message):
pattern = re.compile(r'-')
match = re.split(pattern, message)
if match:
print(match)
else:
print("没匹配上")
if __name__ == '__main__':
message = "2018-9-12"
getMatch(message)
message = "第一步-第二步-第三步-第四步-and more"
getMatch(message)
上述代码运行结果如下图:
6. sub
sub 方法用来替换字符串,它接受5个参数,其中常用的有三个:
- pattern,Pattern 实例
- string,等待替换的字符串
- repl,表示替换的新字符串或需要执行的替换方法
- count,替换次数,默认为0表示全部替换
import re
def getMatch(match):
return match.group(0).replace(r'年龄', 'age')
if __name__ == '__main__':
message = "your 年龄 ?"
pattern=re.compile(r'\w+')
print(re.sub(pattern,getMatch,message))
代码运行结果如下图:
三、总结
Python 中正则表达式使用起来非常方便,上面所展示的代码,完全可以直接复制出来稍加修改后放在项目中使用。内容不多,主要是讲解代码怎么使用,希望大家完全理解掌握了正则表达式的写法。