day17_正規表現

12793 ワード

前言を振り返る
1.演算子のリロード
クラス内で演算子に対応する魔法の方法を実現することで,クラスのオブジェクトに関連演算子の操作をサポートさせる.
2.メモリ管理(面接ポイント)
a.メモリオープン-データを使用する限り、メモリにスペース(数字と文字列)を開きます.b.メモリリリース-(ゴミ回収メカニズム)リファレンスカウントが0であるかどうかを確認します.ループリファレンスの問題に注意してください.
3.浅いコピーと深いコピー(面接ポイント)
コピーの意味浅いコピーと深いコピー:主にサブオブジェクト
補足:リロード関数のリロード-関数名は同じですが、パラメータの数が異なる関数は複数ありますが、pythonは関数のリロードをサポートしていません.
ソケット
serverエンド
from socket import *

# 1.       
server = socket()
# 2.    
server.bind(('10.7.185.92', 8080))
# 3.  
server.listen(512)
# 4.          
while True:
    print('    ...')
    # 5.    
    connect, address = server.accept()

    # 6.    
    redata = connect.recv(1024)
    message = redata.decode(encoding='utf-8')

    # 7.    
    if message == 'text':
        #     
        send_message = input('    :')
        connect.send(send_message.encode())
    elif message == 'image':
        #     
        with open('server/tuzi.jpg', 'rb') as f:
            image_data = f.read()

            connect.send(('{"type":"jpg", "length":%d}' % len(image_data)).encode())
            connect.send(f.read())

    # 8.    
    connect.close()

クライアント側
from socket import socket

# 1.       
client = socket()

# 2.     
client.connect(('10.7.185.92', 8080))

# 3.    
print('1.       text
2. image') send_message = input(':') client.send(send_message.encode()) # 4. if send_message == 'text': text_data = client.recv(1024) print(text_data.decode(encoding='utf-8')) elif send_message == 'image': image_message = client.recv(1024) print(image_message.decode(encoding='utf-8')) while True: image_data = client.recv(1024) # 1024 , 1024 if len(image_data) == 0: break with open('client/image.jpg', 'ab') as f: f.write(image_data) client.close()

正規表現
import re

正規表現は文字列マッチングを行うツールで、多くの言語で正規文法をサポートしています.正規文法は共通しています.
pythonでreモジュールで提供される方法で正則を使用する
re.fullmatch(正規表現、文字列)-完全に一致し、文字列が正規表現のルールを満たしているかどうかを確認します.一致しない結果がNoneの場合、一致結果は一致オブジェクトです.
python正規表現-r'正規'js正規表現-/正規/
1.一致する文字の記号
通常の文字は、正規の文字自体を表します.例えば、a,b,1,2...等.ひとつ任意の文字を一致させるw(アルファベット、数字、アンダースコアを一致させる)s(空白文字を一致させる)t、d(数字文字を一致させる)W(非数値、アルファベット、アンダースコアを一致させる)S(非空白文字を一致させる)D(非数値文字を一致させる)[]文字セットの1文字を一致させる[^](文字セットの反転)
1普通文字
通常の文字は、正規の文字自体を表します.例えば、a,b,1,2...など
1つの文字列に5つの文字が必要です.それぞれh,e,l,l,oです.
re_str = r'hello'
result = re.fullmatch(re_str, 'hello')
print(result)

2 .
ひとつ改行以外の任意の文字に一致
一致する文字列は3文字で、最初の文字はaで、最後の文字はcで、2番目の文字は任意の文字です.
re_str = r'a.c'
result = re.fullmatch(re_str, 'a+c')
print(result)

3w(アルファベット、数字、下線に一致)
1つのwは1文字しか一致しません
注意:これは厳密ではありません.中国語などの文字にもマッチします.
文字列に一致する最初の文字は、アルファベット、数値、または下線で、後ろは「abc」です.
re_str = r'\wabc'
result = re.fullmatch(re_str, '5abc')
print(result)

4s(空白文字に一致)
空白文字:スペース、t、1つのsに1つの文字しか一致しません
1つの長さが8の文字列に一致して、前の3つの文字が任意の文字であることを要求して、中間の2つの空白の文字、後ろの3つの任意の文字
re_str = r'...\s\s...'
result = re.fullmatch(re_str, 'abc
abh') print(result)

5d(数字に一致)
re_str = r'\d\dabc'
result = re.fullmatch(re_str, '82abc')
print(result)

6W(数字、アルファベット、アンダースコアの一致)
7S(空白以外の文字に一致)
長さ4の文字に一致し、後ろの3文字は「abc」で、最初の文字は空白以外の文字であってもよい
re_str = r'\Sabc'
print(re.fullmatch(re_str, '+abc'))

8D(数字以外の文字に一致)
re_str = r'\Dabc'
print(re.fullmatch(re_str, '/abc'))

9[]一致する文字セットの1文字
a.[普通文字セット]-一致文字セットの任意の[1つ]文字b.-すべての中国語に一致
注:[]は1文字しか一致しません
長さ4の文字列を一致させ、最初の文字はxまたはyまたはz、後ろはabc
re_str = r'[xyz]abc'
print(re.fullmatch(re_str, 'zabc'))

長さ4の文字列を一致させ、最初の文字は数字またはx,y,zである.
re_str = r'\dxyz'
print(re.fullmatch(re_str, '5xyz'))

長さ4の文字列を一致させ、最初の文字は数字2-8の1つまたはx,y,zである.
re_str = r'[2-8xyz]abc'
print(re.fullmatch(re_str, '4abc'))

長さ4の文字列に一致し、最初の文字は中国語の文字です.
re_str = r'[\u4e00-\u9fa5]abc'
print(re.fullmatch(re_str, ' abc'))

10[^](文字セットの反転)
[^文字セット]-文字セットにない任意の文字を一致させます.
[^u 4 e 00-u 9 fa 5]-中国語以外の文字に一致
長さ4の文字列を一致させ、最初の文字はx,y,zではありません.
re_str = r'[^xyz]abc'
print(re.fullmatch(re_str, 'mabc'))

2.文字を検出する記号
b(単語境界を検出)文字列の先頭、文字列の末尾、空白、句読点など(単語を区切ったすべての記号)^(文字列の先頭であるか否かを検出)$(文字列の末尾であるか否かを検出する)エスケープ記号は、特殊な機能、意味のある記号の前に''を付け、この正則記号を普通の記号にする^を[]の先頭に置く、-を2文字に置く以外は、その他の特殊記号は、[]に特殊な機能がないものはすべて文字そのものを表す
1b(単語境界を検出)
b-単語の境界であるかどうかを確認します.
単語境界-文字列の先頭、文字列の末尾、空白、句読点など(単語を区切ったすべての記号)
how are you,i am
長さ4の文字列に一致し、最初の文字は任意の文字で、後ろはabcです.cの後ろが単語境界かどうかを検出する
re_str = r'.abc\b'
print(re.fullmatch(re_str, '8abc'))

re_str = r'how\b\sare'  # r'how\bare'      ,        how         a
print(re.fullmatch(re_str, 'how are'))

2^(文字列の先頭かどうかを検出)
re_str = r'^abc'  #      , r'abc'    
print(re.fullmatch(re_str, 'abc'))

print(re.search(r'\d\d', 'ksd34lskfd'))  #            
print(re.search(r'^\d\d', '89ksd34lskfd'))  #                  

3$(文字列の末尾であるかどうかを検出)
re_str = r'abc$'
print(re.fullmatch(re_str, 'abc'))

print(re.search(r'\d\d$', 'sdfsa89'))  #                

3.エスケープ記号
変換記号:特殊な機能、意味を持つ記号の前に「」を付けて、この正則記号を普通の記号にします
注意:^を[]の先頭に置くことと-を2文字に置くことを除いて、その他の単独の特殊な記号、[]に特殊な機能がないのはすべて文字自身を表すことです
re_str = r'\d\d\.\d\d'
print(re.fullmatch(re_str, '89.78'))

re_str = r'\^\d\d'
print(re.fullmatch(re_str, '^79'))

re_str = r'\d\d[.]\d\d'
print(re.fullmatch(re_str, '79.56'))

^[]では冒頭では特に意味がない
re_str = r'\d\d[a^]\d\d'
print(re.fullmatch(re_str, '79=56'))

-[]で2文字の間に置かない限り-そのもの
re_str = r'\d\d[a\]]\d\d'
print(re.fullmatch(re_str, '75]56'))

4.照合回数
*(0回以上マッチ)+(1回以上マッチ)?(0回または1回){N}−マッチングN回{M,N}−マッチング少なくともM回、最大N回{M,}−マッチング少なくともM回{,N}−マッチング最大N回非貪欲:*?0回以上、できるだけ+?1回または複数回、できるだけ少なく?0回か1回、できるだけ少ない{M,N}?{M,}? {,N}?
1*(0回以上一致)
文字*-指定された文字は0回または複数回a*-文字aは0回または複数回d*-数字は0回または複数回[a-z]*-小文字は0回または複数回一致する
re_str = r'a*bc'
print(re.fullmatch(re_str, 'bc'))
print(re.fullmatch(re_str, 'abc'))
print(re.fullmatch(re_str, 'aaabc'))

2+(1回または複数回一致)
一致する文字列の先頭はaで、終了はbで、中間の少なくとも1つの数字
re_str = r'a\d+b'
re_str = r'a\d\d*b'
print(re.fullmatch(re_str, 'a89b'))

3 ?(0回または1回)
練習:正の整数文字列re_に一致する正規表現を書きます.str = r'[-+]?\d+' print(re.fullmatch(re_str, '-9')) print(re.fullmatch(re_str, '9')) print(re.fullmatch(re_str, '+9')) print(re.fullmatch(re_str, '352'))
4 {}
{N}−マッチングN回{M,N}−マッチングは少なくともM回,最大N回{M,}−マッチングは少なくともM回{,N}−マッチングは最大N回
re_str = r'\d{4}'
print(re.fullmatch(re_str, '8273'))

re_str = r'\d{2,4}'
print(re.fullmatch(re_str, '873'))

練習:正規表現を書いてパスワードが要求に合っているかどうかを判断します.パスワードは数字とアルファベットで構成され、最初の文字は大文字で、長さは6-12ビットです.
re_str = r'[A-Z][a-zA-Z\d]{5,11}'
print(re.fullmatch(re_str, 'A873078'))

5.欲張りではない
  • 貪欲-マッチング回数が不確定な場合はできるだけ多くのマッチング(上の回数が不確定な記号は貪欲)
  • 非貪欲-マッチング回数が不確定な場合はできるだけ少ないマッチング(上の回数が不確定な記号の後ろに付けると非貪欲になります)*?-0回以上、できるだけ+?1回または複数回、できるだけ少なく?0回か1回、できるだけ少ない{M,N}?-{M,}? {,N}?
  • re_str = r'a+'
    print(re.search(re_str, 'baaaac'))
    
    re_str = r'a+?'
    print(re.search(re_str, 'baaaac'))
    

    5.分割の合計グループ
    |(分割)グループは部分正則を1つの全体とする
    1|(分之)
    ≪正規1|正規2|正規2|正規1|正規2|正規1で照合し、照合に失敗した場合に正規2で照合します(正規1と正規2で照合に成功した場合、2つの失敗は失敗します).
    注意:正規1マッチングに成功した場合、正規2マッチングは使用されません.
    一致する文字列はabcまたはxyz'abc 123','xyz 123'です.
    re_str = r'abc|xyz'
    print(re.fullmatch(re_str, 'abc'))
    
    re_str = r'\d{3}|{a-zA-Z}{4}|\+{3}'
    print(re.fullmatch(re_str, '+++'))
    

    2.グループ化
    部分正則を一つの全体とする.全体区分re_str = r'(xxx|yyy)[A-Z]{2}[a-z]{2}\d{2}' 2.全体操作re_str = r'(\d{2}[a-z]{2}){3}' 3.全体的な繰り返しM-前のM番目のパケットが一致した内容を繰り返します(パケットは()で囲まれています)
    # re_str = r'xxx[A-Z]{2}[a-z]{2}\d{2}|xxx[A-Z]{2}[a-z]{2}\d{2}'
    re_str = r'(xxx|yyy)[A-Z]{2}[a-z]{2}\d{2}'
    print(re.fullmatch(re_str, 'yyySDsk921'))
    
    # '88jk89ji23sa'
    # re_str = r'\d{2}[a-z]{2}\d{2}[a-z]{2}\d{2}[a-z]{2}'
    re_str = r'(\d{2}[a-z]{2}){3}'
    print(re.fullmatch(re_str, '88jk89ji23sa'))
    
    # 89abc89, 11abc11
    re_str = r'(\d\d)abc\1'  # \  ,            
    print(re.fullmatch(re_str, '89abc89'))
    
    re_str = r'(\d{3})([a-z]{2})\2\1\1'
    print(re.fullmatch(re_str, '231abab231231'))
    
    # import re
    from re import *
    

    1.(了解)compile(正規表現)-正規表現オブジェクトを作成する
    re_str = r'\d{3}'
    re_obj = compile(re_str)
    
    # fullmatch(re_str, '234')
    # re_obj.fullmatch('234')
    

    2.fullmatch-完全一致
    fullmatch(正規表現、文字列)-正規と文字列を完全に一致させ、一致に失敗してNoneを返し、一致に成功して一致オブジェクトを返します
    文字列全体をチェックするときに使用します.例えば、アカウント、パスワードが合法かどうかを判断します.携帯電話番号、メールボックスが合法かどうかなど
    result = fullmatch(r'\d{3}[a-z]{2}[A-Z]{3}', '232anAHS')
    print(result)
    

    3.match-文字列の先頭に一致
    match(正規表現、文字列)-正規と文字列の先頭を一致させ、一致に失敗してNoneを返し、一致に成功して一致オブジェクトを返します
    result = match(r'\d{3}', '345fsj928rc')
    print(result)
    

    4.search-文字列検索
    search(正規表現、文字列)-正規表現と一致する最初のサブ列が文字列に見つかります.一致しない場合はNoneを返し、一致した場合は一致したオブジェクトを返します.
    result = search(r'a(\d{3})([A-Z]{2})', 'hello-a782KDhdd-sdfosh')
    print(result)
    

    マッチングオブジェクトにより以下の内容aが得られる.マッチング結果
    print(result.group())  # a782KD,               
    print(result.group(1))  # 782,             
    print(result.group(2))  # KD,             
    

    b.一致範囲(一致した内容が元の文字列にある範囲-(下付き文字の開始、下付き文字の終了)
    print(result.span())
    print(result.start())
    print(result.end())
    

    c.元の文字列を取得する
    print(result.string)
    

    5.split-文字列切断
    split(正規表現、文字列、切断回数)-正規表現を満たすサブストリングに従って文字列を切断し、リストに切開されたサブストリングを返します.
    カット回数-パラメータを伝達しないで全カット
    print(split(r'\d+|[A-Z]+', 'dhWsf88hef3FEhf23si23hf8h'))
    

    6.sub-文字列置換
    sub(正規表現、新しい文字列、元の文字列、置換回数)-元の文字列の正規表現を満たすサブ列を新しい文字列に置換します.
    置換回数-参照なしですべて置換
    # print('shdfjaha23hj79hjh902nm3jj'.replace('a', '+'))
    print(sub(r'\d', '*', 'how hj2h hskdhfe2398'))
    
    print(sub(r'[   ]|[fF]uck|shit| [   ]', '*', '      ?    '))
    

    7.findall-すべて検索
    findall(正規表現、文字列)-すべての式で正規表現を満たすすべてのサブ列を文字列で検索し、リスト形式で返します.
    print(findall(r'\d+', 'sadhf28hwer82a3sdf92arwfh83'))  # ['28', '82', '3', '92', '83']
    
    print(findall(r'\d+a', 'sadhf28hwer82a3sdf92arwfh83'))  # ['82a', '92a']
    #      ,          
    print(findall(r'(\d+)a', 'sadhf28hwer82a3sdf92arwfh83'))  # ['82', '92']
    
    print(findall(r'(\d+)([a-z]{2})', 'sadhf28hwer82a3sdf92arwfh83'))  # [('28', 'hw'), ('3', 'sd'), ('92', 'ar')]
    
    #   :  findall   ,                      
    print(findall(r'(\d[a-z]){3}\+', 'sfrr8s7d6s+  9d0a7d+hdus  '))  # ['6s', '7d']
    

    8.finditter-すべて検索
    finditter(正規表現、文字列)-正規表現を満たすすべてのサブ列を文字列内で検索します.要素が各サブストリングに対応する一致オブジェクトである反復器を返します.
    result = finditer(r'(\d[a-z]){3}\+', 'sfrr8s7d6s+  9d0a7d+hdus  ')
    print(result)
    for x in result:
        print(x.group(), x.group(1))
    
    def get_name():
        with open('data.txt', encoding='utf-8') as f:
            content = f.read()
            print(content)
            re_str = r'"name":"(.+?)",'
            result = findall(re_str, content)
            # result = re.findall(r'\d\d','ashjf89kjskdf90naskhfk899nn,nmf67jkhh56hkhjk78')
            print(result)
    # get_name()