ホームページ  >  記事  >  バックエンド開発  >  正規表現(正規表現)

正規表現(正規表現)

大家讲道理
大家讲道理オリジナル
2017-05-28 09:57:341978ブラウズ

Regular 正規表現を使用するには、Python で re (正規の略) モジュール をインポートする必要があります。正規表現は文字列の処理に使用され、これらの文字列処理方法を習得すると、多くの操作が容易になります。

正規表現(正規表現)、文字列を処理する方法。 http://www.cnblogs.com/alex3714/articles/5169958.html

Python ではファイル処理が非常に一般的であるため、ファイルに文字列を処理する場合は、正規表現がよく使用されます。その場合は正規表現を使用する必要があります。したがって、正規表現をマスターする必要があります。正規表現に含まれるメソッドを見てみましょう:

(1) match(pattern, string, flags=0)

def match(pattern, string, flags=) 0):
"""文字列の先頭にパターンを適用して、
一致オブジェクトを返すか、一致が見つからなかった場合は None を返します。"""
return _compile(pattern, flags).m​​atch (文字列)

上記のコメント: 文字列の先頭にパターンを適用して、一致オブジェクトを返すか、文字列の先頭から検索を返します。一致するオブジェクトを返すか、見つからない場合は None を返します。

重要なポイント: (1) 最初から検索を開始します。(2) 見つからない場合は None を返します。

いくつかの例を見てみましょう:

import re
string = "abcdef"
m = re.match("abc",string) (1) "abc" と一致してチェックします返される結果は何ですか? print(m)
print(m.group()) n = re.match(
"abcf",string)
print(n) (2) 文字列はリストにありません状況
l = re.match(
"bcd",string) (3) リスト途中の文字列検索状況
print(l)

実行結果:

) なし

上記の出力結果(1)から、match()を使用してmatchを実行するとmatchオブジェクトオブジェクトが返されることがわかります。それを目に見える状況に変換したい場合は、次のように変換にgroup()を使用する必要があります。 in (2); 一致する正規表現が文字列内にない場合は、None (3) が返されます。 match(pattern, string, flag) は文字列の先頭からのみ一致します ( 4) を示します。

(2)fullmatch(pattern, string, flags=0)

def fullmatch(pattern, string, flags=0):
""" を適用してみてください。パターンを文字列全体に適用し、一致オブジェクトを返します。
一致するオブジェクトが見つからない場合は None を返します。上記のコメント: 文字列全体にパターンを適用して、一致するオブジェクトを返すか、一致するオブジェクトが見つからない場合は None を返します。 ..
(3) search(pattern, string, flags)

def search(pattern, string, flags=0):

"""文字列をスキャンして、パターンにマッチし、一致するオブジェクトを返します。 "" ""またはstringの任意の位置で正規表現を検索しないでください一致するオブジェクト オブジェクトが見つからない場合は、None を返します。 重要なポイント: (1) 先頭から検索する match() とは異なり、文字列の途中の任意の位置から検索します。 (2) 検索が見つからない場合は、None が返されます。

import re

String = "ddafsadadfadfafdafdadfasfdafafda"
m = re.search("a",string) (1)途中から一致
print(m)
print(m.group())
n = re.search (
"N",string) (2) 一致しない状況
print(n)

実行結果は以下の通りです。 _sre .SRE_Match オブジェクト;span =(2, 3), match='a'> (1)
a (3)

上記の結果(1)からわかるように、search(pattern, string, flag=0)は途中のどの位置からでもマッチすることができ、match()とは異なり、 からのみマッチすることができるので使用範囲が広がります。 (2) match_object オブジェクトを表示したい場合は、group() メソッドを使用する必要があります。 (3) 見つからない場合は、戻り値が返されます。なし。

(4)sub(pattern,repl,string,count=0,flags=0)

def sub(pattern,repl,string,count=0, flags=0) ):
"""文字列内のパターンの重複しない出現を
置換replで左端
を置換することによって得られた文字列を返します。replは文字列または呼び出し可能のいずれかです;
文字列の場合、その中のバックスラッシュエスケープが処理される
呼び出し可能な場合は、一致オブジェクトが渡され、使用される
return _compile(pattern, flags).sub(repl, string, count)
する必要があります。
sub(pattern,repl,string,count=0,flags=0) 検索と置換、つまり、最初に検索します。パターンが文字列内にあるかどうか。パターンで一致する文字を指定し、正規表現で見つかった文字を置換する必要があります。 count では一致の数と一致の数を指定できます。例は以下のとおりです。
import re
string =
"ddafsadadfadfafdafdadfasfdafafda"
m = re.sub(
"a",

"A",string)

#の数は指定しないでください置換( 1)

print(m)

n = re.sub("a",
"A",string,2)
#置換数を指定(2)
print(n) l = re.sub("F",
"B",string) #
一致しません (3)
print(l)



実行結果は以下の通りです:
ddAfsAdAdfAdfAfdAfdAdfAsfdAfAfdA --(1)
ddAfsAdadfadfafdafdadfasfdafafda -- (2)
ddafsadadfadfafdafdadfasf dafafda --(3)
上記のコード (1) は番号を指定していませんデフォルトでは、一致の数が (2) で指定されている場合は、指定された数だけが一致します。(3) で一致する正規のパターンが文字列内にない場合は、元の文字列が返されます。

注目:(1)一致数を指定可能、一致すべてを指定できません;(2)結果一致しない場合は返される文字列;

(5)subn(pattern,repl,string,count) =0,flags=0)

def subn(pattern, repl, string, count=0, flags=0):
"""(new_string,number)を含む 2 タプルを返します.
new_string は、ソース内のパターンの一番左の
を置き換えることによって得られる文字列です
number は、行われた置換の数です
文字列のいずれかです。または a
callable; 文字列の場合、バックスラッシュエスケープが処理されます。
呼び出し可能な場合は、一致オブジェクトが渡され、使用される置換文字列を返す必要があります

return _compile (パターン, フラグ).subn(repl, string, count)
上面注釈(new_string,number) を含む 2 つのタプルを返します: 戻り一个元组、正しい一致後の新しい文字列と一致する数(new_string,number)を保存するために使用されます。 "、
"A",string)
#

全部置換的情况 (

1

print(m)

n = re.subn("a",
"A",string,3)
# 代替换部分 (
2 print(n) l = re.subn("F",
"A",string) #
指定代替换の文字符串なし (
3) print(l)



运行结如果下:
('ddAfsAdAdfAdfAfdAfdAdfAsfdAfAfdA', 11) ( 1)
('ddAfsAdAdfadfafdafdadfasfdafafda', 3) (2)
('ddafsadadfadfafdafdadfasfdafafda', 0) (3)

上記のコードの出力から、sub() と subn(pattern,repl,string,count=0,flags=0) には同じマッチング効果があることがわかりますが、返される結果は異なります。 sub() は引き続き文字列を返し、subn() は正規表現の後の新しい文字列と置換数を格納するために使用されるタプルを返します。

(6)split(pattern, string, maxsplit=0, flags=0)

def Split(pattern, string, maxsplit=0, flags=0):
"""パターンの出現によってソース文字列を分割します
結果の部分文字列を含むリストを返します。結果の
リストの maxsplit がゼロ以外の場合、最大でも maxsplit 分割が発生します。最後の要素として返されます
s ).split(string, maxsplit)



split(pattern, string, maxsplit=0, flags=0) は、特定の規則的な要件パターンに従った文字列の分割 文字列を分割して、その結果の部分文字列を含むリストを返すことは、文字列を何らかの方法で分割し、その文字列をリストに配置することを意味します。例は次のとおりです。
import re
String =

"ddafsadadfadfafdafdadfasfdafafda"

m = re.split(

"a",string)

#Split string (1

印刷( m)
n = re.split("a",string,3) #分割数を指定
print(n)
l = re.split(
"F",string) #分割文字 リストに文字列が存在しません print(l)



実行結果は以下の通り:
['dd', 'fs', 'd', 'df', 'df', 'fd', 'fd', 'df', 'sfd', 'f', 'fd', ''] ( 1)
['dd', 'fs ', 'd', 'dfafafdafdadfasfdafafda'] (3)

(1) から、文字列の先頭または末尾に分割する文字列が含まれる場合、次の要素は "" になることがわかります。(2) では、分割する回数を指定できます。 at (3) if 分割された文字列がリストに存在しない場合、元の文字列がリストに配置されます。

(7)findall(pattern,string,flags=)

def findall(pattern, string, flags=0):
"""すべての非文字列内で重複する一致があります。

パターンに 1 つ以上のキャプチャ グループが存在する場合、グループのリストを返します。パターンに複数のグループがある場合、これはタプルのリストになります。 ,flags=)Yes 一致するすべての要素を含むリストを返します。リストに保存されます。例は次のとおりです。


import re string =
"dd12a32d46465fad1648fa1564fda127fd11ad30fa02sfd58afafda"
m = re.findall( "[a-z] ",string) #文字に一致し、すべての文字に一致し、リストを返します ( 1)print(m)
n = re.findall(
"[0-9]"、strow(m)| ['d' , 'd', 'a', 'd', 'f', 'a', 'd', 'f', 'a', 'f', 'd', 'a', ' f'、' d'、'a'、'd'、'f'、'a'、's'、'f'、'd'、'a'、'f'、'a'、'f' , 'd' , 'a'] ['1', '2', '3', '2', '4', 、「4」、「6」、「5」、「1」、 「6」、「4」、「8」、「1」、「5」、「6」、「4」、「1」、「2」、「7」、「1」、「1」、「3」 ', '0', '0', '2', '5', '8'] (2)
[] (3)
上記のコードの結果は、(1) すべての文字列、単一の文字列と一致します。一致; 文字列内の数値が (2) で一致した場合はリストが返され、(3) で一致が存在しなかった場合は空のリストが返されます。
キーポイント: (1) 一致が見つからない場合は、空のリストが返されます。(2) 一致の数が指定されていない場合は、1 つの一致のみが行われます。

(8)finditer(pattern,string,flags=0)

def finditer(pattern, string, flags=0):
"""重複しないすべての反復子を返します
文字列内の一致。 一致ごとに、反復子は一致オブジェクトを返します。

空の一致も結果に含まれます。
finditer(pattern,string)查找モード,文字列内の重複しないすべての一致に対する反復子を返します。一致ごとに、反復子は一致オブジェクトです。

import re string = "dd12a32d46465fad1648fa1564fda127fd11ad30fa02sfd58afafda"

m = re.finditer("[a-z]",string)

print(m) n = re.finditer(
"AB", string)
print(n)




运行结果如下:
           (2)

上の実行結果からわかるように、返される finditer(pattern,string,flags=0) はイテレータのオブジェクトです。


def apply(pattern, flags=
0):

「正規表現パターンをコンパイルし、パターンオブジェクトを返します。」

return _compile(pattern, flags)

(10)pruge()

def purge():
「正規表現キャッシュをクリアする」
_cache.clear()
_cache_repl.clear()

(11)template(pattern,flags=0)



def template(pattern, flags=
0):
「テンプレートパターンをコンパイルし、パターンオブジェクトを返す」

return _compile(パターン、フラグ|T)

正则表达式:



语法:

import re
String = "dd12a32d46465fad1648fa1564fda127fd11ad30fa02sfd58afafda"

p = re.compile("[a-z]+") #最初にcomp ile(pattern)を使用コンパイルする
m = p.match(string)
と一致 print(m.group())

上記の 2 行目と 3 行目を 1 行にまとめて次のように記述することもできます:

m <code class="python キーワード">= p.match("^[0- 9] ",'14534Abc'    m = p.match("^[0-9]",'14534Abc'<span style="font-family: 宋体">)</span> )

code>

効果は同じですが、違いは最初の方法は、事前に一致する形式をコンパイルする(一致する式を解析する)ことです

ので、それを行う必要はありません再度照合するとき 照合フォーマットをコンパイルするとき、2 番目の略語は、照合式が照合されるたびに 1 回コンパイルする必要があるということです。したがって、50,000 行のファイルの数字で始まるすべての行を照合する必要がある場合は、次のようになります。最初に通常の式をコンパイルすることをお勧めします。式はコンパイルされてから照合されるため、処理が高速になります。

マッチング形式:

(1)^ 文字列の先頭と一致


import re
string = "dd12a32d41648f27fd1 1a0sfdda"
#^の冒頭に合わせますstring, 次に、
search()を使用して m = re.search("^[0-9]",string)
#数字で始まる文字列に一致 (1)

print( m) n = re.search("^[a-z]+",string) #先頭から一致する場合は
search()(2)とあまり変わりません。 )
print(n.group())

実行結果は以下の通りです。

なし
dd

上記の (1) では、^ を使用して文字列の先頭から一致を開始し、一致の先頭が数字ではなく文字であるため、一致は失敗し、None が返されます。 (2) では、文字でマッチングを開始します。これは、先頭が文字であり、一致が正しく、正しい結果が返されるためです。このように見ると、^ は実際には先頭から開始する match() と似ています。

(2)$ 文字列の末尾と一致します

import re
string = "15111252598"

#^ 文字列の先頭と一致します。今度は、search()を使用して、数字で始まる
を一致させます m = re.match(" ^[ 0-9]{11}$",string)
print(m.group())

実行結果は次のとおりです:

15111252598

re. match("^[0-9]{11}$",string) の意味は、数字で始まり、長さが 11 で、数字で終わる形式と一致することです。

(3) ドット (・) は、改行を除く任意の文字と一致します。 RE.Dotallマークを指定すると、行変更を含む任意の文字と一致する m = re.match(".",string) #dot

(・)

は、数字が指定されていない場合は、単一の文字と一致します。 (1) print( m.group())
n = re.match(".+",string) #.+
は、改行文字を除く複数の任意の文字に一致します (2)
print(n.group())結果は 1
1511 上記のコードの実行結果から、(1) ポイント ( · ) は (2) の任意の文字に一致することがわかります。文字列にスペースが含まれている場合、結果は文字列内の改行文字の前の内容のみと一致し、その後の内容は一致しません。

重要なポイント: (1) ドット (・) は改行文字を除く任意の文字に一致します。(2) .+ は改行文字を除く複数の任意の文字に一致します。

(4) [...] たとえば、[abc] は「a」、「b」、または「c」に一致します。
[object] は括弧内に含まれる文字に一致します。 [A-Za-z0-9] は、A ~ Z、a ~ z、または 0 ~ 9 に一致することを意味します。

import re
string = "1511n125dadfadf2598"

#[]括弧内に含まれる文字と一致
m = re.findall("[5fd]",string) 文字列 print(m) 内の 5,f,d

実行結果は次のとおりです。

['5', '5', ' d', 'd', 'f', 'd', 'f', '5']

上記のコードでは、文字列内の 5、f、d を照合してリストを返します。

(5) [^...] [^abc] abc 以外の任意の文字に一致

import re string = "1511
n125dadfadf2598"
# [^]
括弧内に含まれる文字と一致する m = re.findall("[^5fd]",string)
#文字列内の5, f, d以外の文字と一致するprint(m)

次のように実行します:

['1', '1', '1', 'n', '1', '2', 'a ', ' a', '2', '9', '8']

上記のコードでは、5、f、d 以外の文字と一致し、[^] は角括弧内の文字以外の文字と一致します。

(6)* 0 個以上の式と一致します

import re string = "1511
n125dadfadf2598"
#*
は一致する 0 または複数の式 m = re.findall("d*",string)
#0個以上の数字と一致 print(m)

実行結果は、以下の通り:

['1511', '', '125', '', '', '', '', '', '', '', '2598' , '']

上記の実行結果から、(*) は 0 個以上の文字に一致する式であることがわかります。一致しない場合、戻り値は空であることがわかります。そして最後に返される位置は空 ("") です。

(7) + 1 つ以上の式に一致

import re
string = "1511n125dadfadf2598"

#( +) は 1 に一致します式
m = re.findall("d+",string) #match 1以上の数字
print(m)

次のように実行します:

['1511', '125', '2598']

Add ( +) は 1 つ以上の式に一致します。上記の d+ は 1 つ以上の数値に一致する式です。少なくとも 1 つの数字と一致します。

(8)? 0 または 1 の式に一致します、欲張らない方法

import re
string = "1511n125dadfadf2598"

#(?)は0 または 1 に一致する式
m = re.findall("d?",string) # 0 または 1
print (m)
の式に一致

実行結果は次のとおりです:

['1', '5', 「1」、「1」、「」 '、'1'、'2'、'5'、'、'、'、'、'、'、'、'2'、'5'、'9'、'8' , '']

上記の疑問符 (?) は 0 または 1 つの式と一致し、一致するものが見つからない場合は空 ("") が返されます。

(9) {n} n 回一致し、文字列が一致する回数を定義します

(10) {n,m} n 対 m の式を一致させます

(11) w 文字と数字に一致します

w は文字列内の文字と数字に一致します。コードは次のとおりです:

import re
String = "1511n125dadfadf2598"

#( ? ) は 0 または 1 に一致する式です
m = re.findall("w",string) # 0 または 1 の式に一致します
print( m)
次のように実行します:
['1', 5'、'1'、'1'、'1 '、'2'、'5'、'd'、'a'、'd'、'f'、'a'、'd'、'f'、'2'、'5'、'9'、 '8']
上記のコードからわかるように、w は文字列内の英数字と一致するために使用されます。文字と数字を照合するには正規表現を使用します。
(12) W 大文字の W は、文字以外の文字と数字を一致させるために使用されます。これは、小文字の w の正反対です。
例は次のとおりです。 =
"1511
n

125dadfadf2598"

#W

文字列内の非文字と数字の一致に使用されます m = re.findall("W",string)

#W

非文字と数字の一致に使用されます文字列内の文字と数字 Number print(m)


次のように実行します。 上記のコードでは、 W は文字以外と数値を照合するために使用され、その結果、改行文字が照合されます。

(13)s [ntf]
と同等の任意の空白文字と一致します。

例は次のとおりです:

import re
string = "1511n125dtardffadf2598"

#s を使用してマッチングします文字列 [ntrf] m = re.findall(
"s",string) と同等の任意の空白文字#sは、文字列内の任意の空白文字と一致するために使用されます
print(m)

次のように実行します:

['n', 't', 'r']

走った結果上記のコードは次のことがわかります: s は空の文字と一致するために使用されます

(14) S 空でない文字と一致します

例は次のとおりです。 :

import re string =
"1511n125dtardffadf2598"

#Sは空でない文字に一致します m = re.findall(
"S" , string) #Sは空でない文字と一致するために使用されます
print(m)

次のように実行されます:

['1', '5', '1', '1', '1', '2', '5', 'd', 'a', ' d', 'f', 'a', ' d', 'f', '2', '5', '9', '8']

上記のコードからわかるように、S は空でない文字と一致するために使用され、結果では空でない文字と一致しました。

(15) d [0-9] に相当する任意の数値と一致します

(16) D 数値以外の任意の数値と一致します

概要: findall()、split( ) 生成これらはすべてリストであり、1 つは区切り文字として特定の文字を使用し、もう 1 つは検索ですべての値を使用します。まさにその逆。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。