Pythonプログラミング - 正規表現(例と共に)

Pythonの正規表現

文字列の編集は、データ構造の最大に関し、ほとんどどこでも文字列を操作する必要があります。この方法は、文字列を一致させるためにそこに設計されていますか?強力な武器の文字列にマッチする正規表現のための方法。そのデザインのアイデアは、それ以外の場合は、文字列が正当でない、文字列の規則に従う人々は、我々はそれを「一致」を検討し、ルールを定義するための言語の記述文字列を使用することです。

  1. Python言語モジュール再正規表現のすべての機能を備えています。物事は、正規表現の使用に行っていたならば、我々は再--import reモジュールをインポートする必要があります。
  2. complieパターン文字列と機能の詳細オプションのflagsパラメータオブジェクトは、正規表現を生成します。このオブジェクトは、正規表現のマッチングや交換のための一連の方法があります。

まず、基本的な

  • 直接指定した場合、正規表現では、文字列が完全一致です。Dを\によって数マッチングを表し、\ wは一致する文字または数字を表します。
  • あなたは、任意の文字を一致させることができます。
  • +を用いて、*で示される、(ゼロを含む)任意の数の文字を1文字以上を示すと、正規表現で可変長文字にマッチしますか?N {N}を用いて、0または文字列を表す{N、M}はNM文字を意味して、文字列を表します。
import re  #导库

re.match()        #match函数从头开始匹配,如果不是起始位置匹配成功的话,match函数的匹配结果就为none
re.match()        #搜素整个字符串,并返回第一个成功的匹配
re.search()        #搜索整个字符串,返回一个list(最常用的)
re.findall()        #compile  函数用于编译正则表达式,生成一个正则表达式(pattern)对象
re.split()        #将一个字符串按照正则表达式匹配的结果进行分割,返回列表类型
re.sub()        #在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串

例:

import re  #导库
astr="s34份额是否as586c河1源..is市9.1d3防4H不0防h7b不仅4.r5cd"
 
print(re.findall("\d",astr))        #findall()在字符串中找到所有的数字,并以列表的形式返回
print(re.search("\w",astr))        #匹配一个字母或数字,并将第一匹配到的结果返回
print(re.findall("\w\d",astr))        #匹配连续的两个数字,一个字母一个数字,一个汉字一个数字,并将所有匹配到的结果以列表的形式返回
print(re.findall(r"\d.\d",astr))        #匹配连续的三位——> 第一位和第三位都是数字,中间为任意字符
print(re.findall("\d+",astr))        #匹配1位到无穷多位连续的数字
print(re.findall("\d\d+",astr))      #匹配2位到无穷多位连续的数字
print(re.findall("\d\d*",astr))      #匹配1位到无穷多位的连续数字
print(re.findall("\d\d?",astr))        #  ?  表示0或1位字符,故表示一位或两位连续数字
print(re.findall("\d{3}",astr))       #返回三位连续的数字
print(re.findall("\d{1,3}",astr))        #贪婪匹配,优先三位查询,接着两位,最后一位
print()re.findall("\d{2,3}?",astr)        # ?  可将贪婪匹配变成非贪婪匹配;先匹配两位数字,然后再匹配三位数字

运行结果:
['3', '4', '5', '8', '6', '1', '9', '1', '3', '4', '0', '7', '4', '5']
<_sre.SRE_Match object; span=(0, 1), match='s'>
['s3', 's5', '86', '河1', '市9', 'd3', '防4', '不0', 'h7', '仅4', 'r5']
['586', '9.1', '3防4']
['34', '586', '1', '9', '1', '3', '4', '0', '7', '4', '5']
['34', '586']
['34', '586', '1', '9', '1', '3', '4', '0', '7', '4', '5']
['34', '58', '6', '1', '9', '1', '3', '4', '0', '7', '4', '5']
['586']
['34', '586', '1', '9', '1', '3', '4', '0', '7', '4', '5']
['34', '58']

第二に、段階を強化

より正確には一致を行い、使用することができる[例えば、の範囲を表します。

  • [0-9A-ZA-Z_]は数字、文字またはアンダースコアに一致します。
  • [0-9A-ZA-Z _] +少なくとも一つの数字、文字にマッチし、またはそのような「A100」、「0_Z」、「py3000」など、文字列を強調することができます。
  • [A-ZA-Z _] [0-9A-ZA-Z _] *有効な変数パイソンある文字またはアンダースコア、任意のデジタル数、文字が続くまたは下線文字列と一致します。
  • [A-ZA-Z _] [0-9A-ZA-Z _] {0,19}は正確に可変の長さを制限するには、1〜20文字(リア+の前に1つの文字(0〜19)文字)です。
import re
astr="A_c8fd33jd9_k0ja3"
print(re.findall("[0-9a-zA-Z\_]",astr))
print(re.findall("[0-9a-zA-Z\_]+",astr))
print(re.findall("[a-zA-Z\_][0-9a-zA-Z\_]*",astr))
print(re.findall("[a-zA-Z\_][0-9a-zA-Z\_]{0,19}",astr))

运行结果:
['A', '_', 'c', '8', 'f', 'd', '3', '3', 'j', 'd', '9', '_', 'k', '0', 'j', 'a', '3']
['A_c8fd33jd9_k0ja3']       #贪婪匹配
['A_c8fd33jd9_k0ja3']      
['A_c8fd33jd9_k0ja3']  
  • | BはAまたはBと一致し、そう '(P | P)ython' または 'パイソン'。
  • ^ ^ \ dは数字で開始する必要性を表明し、行の先頭を表します。
  • $ D $の表現は、数字で終わらなければなりません\、行の終わりを表します。
  • あなたは、Pyはまた、「パイソン」を一致させることができ、気づいているかもしれませんが、^ PYの$の全体のラインが試合になって、それが「PY」アップに一致することができます。
  • Rが先行Python文字列は、ネイティブの文字列を表します
import re
astr=astr="""csd3份额是否a9
sjhbh353758cdbsv河
1源..is市....cd3防4H不胜
防hh787bb不仅4.r5cd是is范德萨;‘’a8"""

print(re.findall(r"^\d",astr))      #换行符号不可见,将整段字符串按已行处理;行的开头为数字,则返回该数字,如不是,返回一个空列表
print(re.findall(r"^\d",astr,re.M))      #re.M 是换行符可见,将astr字符串转换为4行;行的结尾是数字,则返回该数字
print(re.findall(r"\d$",astr))        #行的结尾为数字
print(re.findall(r"\d$",astr,re.M))        #re.M 是换行符可见,将astr字符串转换为4行;行的结尾为数字,则以列表的形式返还该数字

运行结果:
[]
['1']
['8']
['9', '8']

第三に、正規表現の具体的な使用

1、クエリ

(1)re.search関数

re.matchマッチの開始位置が成功re.match()メソッドであれば、パターンの開始位置から文字列に一致すると、一致するオブジェクトを返し、実際には、位置は、成功一致、一致しない()Noneを返します。

構文は次のとおりである:re.match(パターン、文字列、フラグ= 0)

 (1)  pattern:需要匹配的正则表达式;
(2)string:在那个字符串中就行行匹配;
(3)flags:标志位(默认为0),它可以控制正则表达式的匹配方式;

一般的なフラグは次のとおりです。

(1)re,l 忽略匹配时的大小写
(2)re.M 多行匹配,影响 ^ 和 $ 
(3)re.S. 默认不匹配换行,使 . 匹配包括换行在内的所有字符
(4)re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B

例としては、次のとおりです:

スパンにより()マッチの位置を取得することができ、我々は成功し、re.match方法をマッチングmatch関数は、正規表現に一致しないオブジェクトのマッチングを返し、それを見ることができます。

>>> import re
>>> astr='11you are 3344 my apple\n 11开心果,you\n66a77'
>>> re.match('11',astr)
<_sre.SRE_Match object; span=(0, 2), match='11'>
>>> re.match('11',astr).span()
(0, 2)
>>> print(re.match('you',astr))
None

あなたが正規表現に一致する必要がある場合に表示、我々は一致する、一致する対象式を取得するためにグループ(数値)またはグループ()関数を使用する必要があります。

例えば:re.match(「\ D()(\ D)R」、ASTR)、文字列と一致する必要は、グループとして各ブラケットのブラケットが複数存在してもよいです。

  • (。)グループ(0)、D(\ d)を\、式全体、すなわちマッチする文字列です。
  • グループ(1)すなわち、ブラケットの内容を表しようにし、(。);
  • グループ(NUM = 2,3,4 ...)反対側ブラケットがコンテンツを表します。
  • グループ()は、結果が返されるタプルのブラケットの全ての内容を含む文字列を返します。
>>> import re
>>> astr='11you are 3344 my apple\n 11开心果,you\n66a77'
>>> re.match('\d(\d)(.)',astr,re.S).group(0)
'11y'
 
>>> re.match('\d(\d)(.)',astr,re.S).group(1)
'1'
 
>>> re.match('\d(\d)(.)',astr,re.S).group(2)
'y'
 
>>> re.match('\d(\d)(.)',astr,re.S).groups()
('1', 'y')
(2)re.search関数

文字列全体を検索し、最初に一致を返します。

構文は次のとおりである:re.search(パターン、文字列、フラグ= 0)

(1)パターン:正規表現に一致する必要性と、
(2)文字列:文字列が一致する;
(3)フラグ:フラグ(デフォルト0)は、メソッドに一致する正規表現を制御することができます。

一般的なフラグは次のとおりです。

;(1)に一致するときのサイズを無視Re.l
、(2)re.M複数行のマッチングに影響^と$
;.、試合を折り返すなど、すべての文字を含む、(3)デフォルトのre.Sラップを一致していない
(4 )re.Uは、Unicode文字セットに基づいて文字を解析します。このフラグは、\ W、\ bの、wは\影響を与える 、\ B

例としては、次のとおりです:
我々は、正規表現と一致しない、成功、re.search方法に一致する検索機能は、オブジェクトのマッチングを返し、見ることができる;スパン()によって一致の位置を取得することができます。スパン場合()マッチの位置を取得することができます。返される一致がない場合はNoneです。

>>> import re
>>> astr='11you are 3344 my apple\n 11开心果,you\n66a77'
>>> re.search('11',astr)
<_sre.SRE_Match object; span=(0, 2), match='11'>
 
>>> re.search('you',astr)
<_sre.SRE_Match object; span=(2, 5), match='you'>
 
>>> re.search('you',astr).span()   #通过span()获取匹配的位置
(2, 5)
 
>>> re.search('11',astr).span()
(0, 2)
 
>>> print(re.search('22',astr))
None

あなたが正規表現に一致する必要がある場合に表示、我々は一致する、一致する対象式を取得するためにグループ(数値)またはグループ()関数を使用する必要があります。

例えば:re.search(「\ D()(\ D)R」、ASTR)、文字列と一致する必要は、グループとして各ブラケットのブラケットが複数存在してもよいです。

  • (0)グループ全体の表現にマッチする文字列である、すなわち、\ dを(。)(\ d)の
  • グループ(1)すなわち、ブラケットの内容を表しようにし、(。)
  • グループ(NUM = 2,3,4 ...)は、対応するコンテンツブラケットことを示しています。
  • グループ()返されたタプルの結果として、ブラケットの全ての内容を含む文字列を返します。
>>> import re
>>> astr='1you are 3344 my apple\n 11开心果,you\n66a77'
>>> re.search('\d(\d)(.)',astr,re.S).group(0)
'334'
 
>>> re.search('\d(\d)(.)',astr,re.S).group(1)
'3'
 
>>> re.search('\d(\d)(.)',astr,re.S).group(2)
'4'
 
>>> re.search('\d(\d)(.)',astr,re.S).groups()
('3', '4')

re.search差re.match機能と機能:
文字列が正規表現を開始するために準拠していない場合re.matchは、文字列の始まりに過ぎないと一致して、マッチが失敗し、関数はNoneを返します;となるまで、文字列全体にマッチre.search一致が見つかった一致しない場合は、どれも返されません。

注意:試合とこの試合は、検索、およびすべてのfindAll一致しています。

(3)re.findall関数

正規表現で見つかった文字列は、すべてのサブ文字列に一致し、リストを返します。一致が見つからない場合は、空のリストが返されます。

構文は次のとおりである:re.findall(パターン、文字列、フラグ= 0)

例としては、次のとおりです:

>>> import re
>>> astr='1you are 3344 my apple\n 11开心果,you\n66a77'
>>> re.findall('\d\d',astr)         #列表形式显示所有的两个数字
['33', '44', '11', '66', '77'] 
 
>>> re.findall('\d{2,4}',astr)      #列表形式显示所有的2——4个数字,默认贪婪匹配
['3344', '11', '66', '77']
 
>>> re.findall('\d+',astr)          #(1,无穷)
['1', '3344', '11', '66', '77']
 
>>> re.findall('\d*',astr)          #(0,无穷)
['1', '', '', '', '', '', '', '', '', '3344', '', '', '', '', '', '', '', '', '', '', '', '11', '', '', '', '', '', '', '', '', '66', '', '77', '']
 
>>> re.findall('\d?',astr)          #匹配0或1
['1', '', '', '', '', '', '', '', '', '3', '3', '4', '4', '', '', '', '', '', '', '', '', '', '', '', '1', '1', '', '', '', '', '', '', '', '', '6', '6', '', '7', '7', '']
 
>>> re.findall('\d{2,3}?',astr)      #一个模式后跟?,不贪婪匹配,范围后面?,有两次就先取两次
['33', '44', '11', '66', '77']
 
>>> re.findall('\d.\d',astr)         #匹配两个数字与中间任意字符
['334', '6a7']
 
>>> re.findall('^\d',astr)           #以数字开头
['1']
 
>>> re.findall('^\d',astr,re.M)      #多行匹配
['1', '6']   
 
>>> re.findall('\d$',astr)           #以数字结尾
['7']
 
>>> re.findall('\d$',astr,re.M)      #多行匹配,影响^和$
['7']
 
>>> re.findall('\d(.)(\d)',astr,re.S)#列表形式返回,每项为一个元组
[('3', '4'), ('a', '7')]
(4)re.complie機能

complie関数は、正規表現をコンパイルする正規表現(パターン)オブジェクトを生成するために使用されます。

構文は次のとおりである:re.compile(パターン、フラグ= 0)
パターン:正規表現に一致する必要があります。
フラグ:フラグ(デフォルト0)、それが正規表現に一致するモードを制御することができます。

ここで引用され

一般的なフラグは次のとおりです。

  • 一致する場合を無視するre.I
  • re.M複数行のマッチング、^と$に影響を与えます
  • re.S.デフォルトでは、すべてを含む、改行文字を含むと一致します。改行と一致していません
  • re.Uは、Unicode文字セットに基づいて文字を解析します。このフラグは、\ W、\ bの、\ B、wは\影響します

例としては、次のとおりです:

>>> import re
>>> astr='AS12as34er567q!"3456'
>>> m1=re.compile(r'\d\d')     #编译
>>> m1.search(astr).group()    #匹配
'12'
 
>>> m1.findall(astr)
['12', '34', '56', '34', '56']
 
>>> m2=re.compile(r'a',re.I)  #编译
>>> m2.findall(astr)          #匹配
['A', 'a']  
(5)re.split関数

正規表現マッチングの結果に応じて文字列を分割し、タイプのリストを返します。

構文は次のとおりである:re.split(パターン、文字列、maxsplit個= 0、フラグ= 0)

  • パターン:正規表現に一致する必要があります。
  • 文字列:行にマッチした文字列。
  • maxsplit個:周波数分割、一度分割maxsplit個= 1、デフォルトは0であり、数が限定されるものではありません。
  • フラグ:フラグ(デフォルトは0である)、それが正規表現に一致するモードを制御することができます。

一般的なフラグは次のとおりです。

  • 一致する場合を無視するre.l
  • re.M複数行のマッチング、^と$に影響を与えます
  • re.S.のデフォルトはすべて含めて、改行文字を含むと一致します。改行と一致していません
  • re.Uは、Unicode文字セットに基づいて文字を解析します。このフラグは、\ W、\ bの、\ B、wは\影響します
>>> import re
>>> astr='AS12as34er567q!"3456'
>>> astr.split('12')           #通过12进行分割
['AS', 'as34er567q!"3456']
 
>>> re.split("\d{2}",astr)     #通过两个数字进行分割
['AS', 'as', 'er', '7q!"', '', '']
 
>>> re.split("\d+",astr)       #通过数字进行分割
['AS', 'as', 'er', 'q!"', '']
 
>>> m3=re.compile(r'\d+')      #与上面等价,运用了compile函数
>>> m3.split(astr)
['AS', 'as', 'er', 'q!"', '']  
 
>>> m3.split(astr,3)           #指定分割几次
['AS', 'as', 'er', 'q!"3456']
(6)。Re.sub関数

置換文字列文字列は、文字列内のすべての正規表現にマッチし、交換後に返します

構文は次のとおりである:re.sub(パターン、REPL、文字列、COUNT = 0、フラグ= 0)

  • パターン:正規表現に一致する必要があります。
  • REPL:文字列を置換し、関数であってもよいです。
  • 文字列:この文字列の一致線で、
  • カウント:パターンマッチングの置換の最大数は、デフォルトではすべての出現を置き換えるために0です。
  • フラグ:フラグ(デフォルト0)は、メソッドに一致する正規表現を制御することができます。

一般的なフラグは次のとおりです。

  • 一致する場合を無視するre.l。
  • re.M複数行のマッチング、^と$に影響を与えます
  • re.S.のデフォルトはすべて含めて、改行文字を含むと一致します。改行と一致していません
  • re.Uは、Unicode文字セットに基づいて文字を解析します。このフラグは、\ W、\ bの、\ B、wは\影響します

例としては、次のとおりです:

>>> import re
>>> astr='AS12as34er567q!"3456' 
>>> re.sub("5",'9',astr)     #将5替换为9
'AS12as34er967q!"3496'
 
>>> m4=re.compile(r"\d+")    
>>> m4.sub(' ',astr)         #将数字替换为空字符串
'AS as er q!" '
 
>>> m4.sub(' ',astr,2)       #指定替换几次
'AS as er567q!"3456'

REPLパラメータが2でデジタルストリングを実現する機能です。

>>> import re
>>> def f(m):
...     return str(2*int(m.group()))
...
>>> re.sub('\d',f,'a2233q')
'a4466q'

第四に、コメントを追加しました:

図1に示すように、正規表現修飾子 - オプションのフラグ

正規表現は、必要に応じてパターンマッチングを制御するために、いくつかの識別子を含むことができます。修飾子は、オプションの符号として指定されています。()複数のフラグをビット単位のORを介し得る|彼らは、指定します。re.l | re.Mは、LとMフラグに設定されています:

修飾子 説明
re.l 試合は大文字と小文字を区別しません
re.L 認識のローカライズ(現地対応の)一致
re.M ^と$に影響を与えるマルチラインのマッチング、
re.S ことを確認します。すべてには、改行文字を含む一致しました
re.U 文字のUnicode文字セットを解析するためによります。このフラグは、\ W、\ bの、\ B、wは\影響します
re.X あなたが理解しやすい正規表現を記述するように、あなたの形式でより多くの柔軟性を与えることによってフラグ。

2、表現の定期的なコモンモード

共通モード

モード 説明
^ 文字列の先頭にマッチします
$ 文字列の末尾にマッチします
改行以外の任意の文字に一致し、re.Sフラグが指定されている場合、一致する任意の文字列には改行を含むと、
* 前の文字0回または拡張子の数は無制限
+ 1つの前の文字または無制限の拡大
前の文字0または1の拡張、非貪欲な方法
{M} 私たちは、文字m回を拡張する前に。例えば、AB {2} CはABBCを表します
{M、N} 一つの文字が前に貪欲マッチング、n回のM(n回を含む)に拡張します
| B またはbにマッチします
() 内部関数を使用して、パケットマーキング|演算子
\ワット [A-ZA-b0-9_]に相当する、英数字およびアンダーマッチ
\ W 非マッチング、および[^ A-ZA-Z0-9_]に英数字等価を強調
\ sの マッチ任意の空白に相当する文字、[\ T \ n \ R \ F]
\ S 同等の任意の非空白文字にマッチします[^ \ F \ nは\ rを\トン\ V]
\ dは [0-9]と等価である、任意の数と一致
\ B つまり、単語間の位置とスペースを指し、ワード境界に一致します。例えば、「ERの\ bは、」「ER」内のER「」とは一致しません「動詞」で「決して」と一致しません。
\ B 非ワード境界に一致します。でER「\ B」マッチ「動詞は、」「えー」が、「ER」に「決して」と一致しません
3、正規表現の例
説明
^ [A-ZA-Z] + $ 26文字の文字列
^ [A-ZA-Z0-9] + $ 26の文字と数字の文字列
^ - ?\ dは+ $ 整数文字列
[1-9] \ dの{5} 中国国内の郵便番号、6
\ u4e00- \ u9fa5 中国語の文字をマッチング
\ D {3} - \ dの{8} |の\ D {4} - \ dの{7} 電話番号

おすすめ

転載: blog.csdn.net/weixin_45116657/article/details/92091305