2018-10-23 day 18まとめ

12900 ワード

一、正規表現文法
正規表現は、文字列を一致または記述するツールです.
用途:
a.文字列が条件を満たしているか否かを判定する---入力された文字列がメールボックス/携帯電話番号であるか否かを判定する.IPアドレスかどうか
b.条件を満たす文字列を抽出する
c.文字列置換
pythonではreモジュールの対応する方法で正規表現のマッチング、検索、置換などの機能をサポートします.
from re import fullmatch

fullmatch(正規表現文字列、文字列)--->正規表現と文字列が正規表現文字列に完全に一致するかどうかを判断します.文字列で正規表現構文です.r'正規表現'正規表現には2つの部分が含まれています.1つは正規文法に対応する文字で、2つは普通の文字です.
1時です.(任意の文字に一致)
ひとつ1文字のみ一致
#       3    ,      'a',           ,       b
re_str = r'a.b'
result = fullmatch(re_str, 'a|b')
print(result)
#        4,               a b,               
re_str = r'a..b'
result = fullmatch(re_str, r'a
b') print(result)

2w(アルファベットアンダースコアに一致)
1文字に一致するw
#                    ,               
re_str = r'\w...'
result = fullmatch(re_str, 'o8js')
print(result)

3s(任意の空白文字に一致)
空白文字:スペース、タブ(t)、折り返し(改行)など、空白文字を入力します.
#           a,        ,      b    
re_str = r'a\sb'
result = fullmatch(re_str, 'a
b') print(result)

4d(数字に一致)
1つのdが1つの数字に一致する
re_str = r'\d\d\d'
result = fullmatch(re_str, '282')
print(result)

5b(検出境界)
1つのbは1つの文字に一致しないで、単純にbが現れる位置が単語境界の単語境界であるかどうかを検出します:文字列の開始と終了、スペース、改行、句読点など、2つの単語を隔てた文字を単語境界にすることができます
re_str = r'\babc'
re_str = r'abc\b\saaa'  #            abc,        ,   aaa。    c       
result = fullmatch(re_str, 'abc aaa')
print(result)

6^(文字列の先頭かどうかを検出)
re_str = r'^\d\d\d'   #                 
result = fullmatch(re_str, '123')
print(result)

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

8W(非アルファベット、アンダースコアの一致)
re_str = r'\Wabc'
result = fullmatch(re_str, '#abc')
print(result)

9S(空白以外の文字に一致)
re_str = r'\S...'
result = fullmatch(re_str, '2jkh')
print(result)

10D(数字以外の文字に一致)
re_str = r'\D\w\w\w'
result = fullmatch(re_str, '#h7_')
print(result)

11B(単語境界でないか検出)
re_str = r'and\BYou'
result = fullmatch(re_str, 'andYou')
print(result)

12.[](カッコ内に表示される任意の文字に一致)
1つの[]は、文字セットに一致する[文字セット]-->は、文字セットの任意の文字です.たとえば、[abc],[d+]
[文字1-文字2]-->Unicode符号化値が文字1から文字2のいずれかである文字を一致させる.文字1の符号化値が文字2より小さいことが要求されます.たとえば、[1-9]-->数字1から9[a-z]-->小文字[A-Z]-->大文字[>数字1から9[u 4 E 00-u 9 fa 5]-->すべての漢字に一致する
注意:-中括弧で、2文字の間に範囲を表す場合.
#             a  b c,    a"""
re_str = r'[abc]aaa'
result = fullmatch(re_str, 'caaa')
print(result)
re_str = r'[1-4]\d\d\d'
result = fullmatch(re_str, '1989')
print(result)
re_str = r'[\u0031-\u0039][a-z]'
result = fullmatch(re_str, '1h')
print(result)
re_str = r'[\u4E00-\u9fa5][\u4E00-\u9fa5][\u4E00-\u9fa5]'
result = fullmatch(re_str, '   ')
print(result)
re_str = r'[91-]'
result = fullmatch(re_str, '-')
print(result)
#       ,             
re_str = r'[\w\s]'
result = fullmatch(re_str, 'u')
print(result)

13[^文字セット](文字セットにない任意の文字に一致)
注意:^は中括弧の一番前に置かなければ有効ではありません
"""          ,     abc      ,         """
re_str = r'[^abc]...'
re_str = r'[^1-9]...'
result = fullmatch(re_str, '898i')
print(result)

二、正規表現回数相関記号
1.*(一致は0回または複数回)
文字*-->文字が0回以上表示されます.
#   0           
re_str = r'\d*'
print(fullmatch(re_str, '123'))
#                       :         ,     (    1 )
re_str = r'[a-zA-Z_]\w*'
print(fullmatch(re_str, 'A'))

2.+(1回または複数回一致)
#   abc               
re_str = r'\d+abc'
print(fullmatch(re_str, '9abc'))

3. ?(マッチング0回または1回)
re_str = r'a?123'
print(fullmatch(re_str, 'a123'))
#   :        ,       (123, -2334, +9...     ,012, -023,+0122    )
re_str = r'[-+]?[1-9]\d*'
print(fullmatch(re_str, '1234'))

4.{}(指定回数)
{N}-->N回{M,N}-->MからN回{M,}-->少なくともM回{,N}-->最大N回
re_str = r'\d{3}'
print(fullmatch(re_str, '123'))

re_str = r'\d{3,}'
print(fullmatch(re_str, '1234'))

re_str = r'\d{,3}'
print(fullmatch(re_str, '23'))

re_str = r'[a-z]{2,5}'
print(fullmatch(re_str, 'aajk'))

#           :           ,     6-16 
re_str = r'[\da-zA-Z]{6,16}'

三、分の和グループ
1.|(分)
条件1|条件2-->まず条件1でマッチングし、マッチングが成功すればマッチングに成功します.条件1の一致に失敗した場合は、条件2で一致します.注意:条件1が一致した場合、条件2では一致しません.
re_str = r'[a-z]{3}|[A-Z]{3}'
print(re.fullmatch(re_str, 'AHD'))
#       abc,d aaa
re_str = r'abc|d|aaa'
print(re.fullmatch(re_str, 'aaa'))
# 'abc'+W/H/Y
re_str = r'abc(W|H|Y)'
print(re.fullmatch(re_str, 'abcY'))#      ,       ‘abcW’, 'H' , 'Y'  

2.()(グループ)
a.コンビネーション(かっこ内の内容を一体として扱う)b.キャプチャ--かっこ付き正規表現を使用してマッチングに成功した後、カッコ内の内容c.反復のみを取得--正規表現では、前の()で一致した結果を数で繰り返すことができます.数値は、最初のグループを表します.
 #a.  
#        ,          3 
re_str = r'(\d[a-zA-Z]){3}'
print(re.fullmatch(re_str, '2h8h7j'))
# b.  
re_str = r'(\d{3})abc'
print(re.fullmatch(re_str, '773abc'))
print(re.findall(re_str, 'euhasdhf873abcssjsja235abcu-03s834432abcjjsks'))
# c.  
re_str = r'([a-z]{3})-(\d{2})\2'
print(re.fullmatch(re_str, 'hsn-2323'))

3.エスケープ記号
正規表現では、特殊な記号の前にを付けることで、特殊な記号に意味を持たせることができます.-->任意の文字.-->文字.+-->1回または複数の+-->文字+
注意:中括弧には特殊な機能を持つ記号があり、記号自体のみを表します.
どこにいてもエスケープが必要です-[]の外には特別な機能はありません.[]で-そのものを表すには、2文字の間に置かないでください()エスケープが必要です
re_str = r'\d{2}\.\d{2}'
print(re.fullmatch(re_str, '12.34'))
re_str = r'\d\+\d'
print(re.fullmatch(re_str, '3+7'))
re_str = r'\(\\'
print(re.fullmatch(re_str, '(\\'))
re_str = r'(\d{3})\1([a-z]{2})\2\1'
print(re.fullmatch(re_str, '123123bbbb123'))

四、reモジュールの関数
1.compile(正規表現文字列)-->正規表現文字列を正規表現オブジェクトに変換
re_objct = re.compile(r'\d+')
print(re_objct)
print(re_objct.fullmatch('23738'))

2.fullmatchとmatch
fullmatch(正規表現文字列、文字列)-->正規表現で文字列を完全に一致させ(文字列全体を一致させる)、一致オブジェクト(SRE_Match)またはNoneを返します.
match(正規表現文字列、文字列)-->文字列の先頭に一致し、一致するオブジェクトまたはNoneを返します.
result = re.fullmatch(r'\d([a-zA-Z]+)123', '2hjdh123')
print(result)   
 #<_sre.sre_match object="" span="(0," match="2hjdh123">
result = re.match(r'\d([a-zA-Z]+)123', '2hjdh123ABC')
print('match:',result) 
#<_sre.sre_match object="" span="(0," match="2hjdh123">
  • 1.span(group=0)-->マッチングに成功した区間(左閉右開区間)
  • を取得
    print(result.span(0))
    print(result.start(1))   #           
    print(result.end(1))     #               
    
  • 2.group(group=0)-->一致結果の取得
  • group()/group(0)-->正規表現が完全に一致した結果を取得group(index>0)-->正規表現のgroup番目のパケットが一致した結果を取得
    print('0:',result.group())
    print('1:',result.group(1))
    
  • 3.string-->一致する元の文字列
  • を取得
    print(result.string)
    result = re.match(r'\d([a-zA-Z]+)123', '2hjdh123ABC')
    print('match:',result)
    

    3.search
    search(正規表現、文字列)-->正規表現を満たす文字列の最初の文字列を検索します.戻り値は、一致するオブジェクトまたはNoneです.
    result = re.search(r'(\d)[a-zA-Z]+', 'uhsh2hdje+984nf')
    print(result.group(0))
    print(result.group(1))
    print(result.string)  
    
    #   :  search                 
    # 'abc34jshd8923jkshd9lkkk890k' --> 34,8923,9,890
    re_str = r'\d+'
    str1 = 'abc34jshd8923jkshd9lkkk890k'
    result = re.search(re_str, str1)
    while result:
        print(result)
        str1 = str1[result.end():]
        result = re.search(re_str, str1)
    

    4.findall
    findall(正規表現、文字列)-->正規表現を満たす文字列のすべてのサブ列を取得し、正規表現にパケットがある場合、値を取るときはパケットに一致する結果のみを取る.複数のグループがある場合、各グループが一致する結果は、元の要素として使用されます.
    re_str = r'(\d+)k([a-d]+)'
    str1 = 'abc34kshd8923kabcshd9lkkk890kaa'
    result = re.findall(re_str, str1)
    print(result)  # [('8923', 'abc'), ('890', 'aa')]           
    
    re_str = r'(\d+)k[a-d]+'
    str1 = 'abc34kshd8923kabcshd9lkkk890kaa'
    result = re.findall(re_str, str1)
    print(result)  # ['8923', '890']              
    
    re_str = r'\d+k[a-d]+'
    str1 = 'abc34kshd8923kabcshd9lkkk890kaa'
    result = re.findall(re_str, str1)
    print(result)  # ['8923kabc', '890kaa']
    

    5.finditer
    finditter(正規表現、文字列)-->正規条件を満たすすべてのサブ列を検索します.戻り値は反復器、反復器の要素は一致オブジェクトです.
    re_str = r'\d+'
    str1 = 'abc34kshd8923kabcshd9lkkk890kaa'
    result = re.finditer(re_str, str1)
    print(result)
    for item in result:
        print(item)   
    #
    

    6. split
    split(正規表現、文字列)-->正規表現の条件を満たすサブ列で文字列を分割
    str1 = 'ahsb1sssa8-jjhd7nhs+90nsjhf3-4hhh7+8kjj-'
    result = re.split(r'[-+]', str1)
    print(result)
    #['ahsb1sssa8', 'jjhd7nhs', '90nsjhf3', '4hhh7', '8kjj', '']
    

    7.sub
    sub(正規表現、repl、文字列)-->正規表現条件を満たす文字列のサブ列をreplに置き換えます.置換後の文字列を返します
    str1 = 'hsj8jskfh98ssjj8hshh'
    result = re.sub(r'\d+','*', str1)
    print(result)
    
    str1 = '        ,    ? ,    ,      '
    result = re.sub(r' \s* | |fuck|  | \s* ', '*', str1)
    print(result)
    

    五、歌詞解析
    需要:指定曲を再生する时、1つの时间を与えて、この歌をこの时间に対応する言叶を返すことができます
    オブジェクト向け:歌詞を解析する機能を持つクラスを探します
    class Lyrics:
        """   """
        def __init__(self, time='', word=''):
            self._time = time
            self.word = word
    
        @property
        def time(self):
            return self._time
        @time.setter
        def time(self, value):
            fen = float(value[1:3])
            miao = float(value[4:])
            self._time = fen*60+miao
    
        def __gt__(self, other):
            return self._time > other._time
    
        def __repr__(self):
            return str(self.__dict__)
    
    class LyricsAnalysis:
        """     """
        # name = ''
        def __init__(self, name):
            self.__name = name  #   
            self.__all_lyric = []  #                
    
        #        
        def __split_time_word(self, line):
            #       
            lines = line.split(']')
            # print(lines)
            #       
            word = lines[-1]
            #           
            for time in lines[:-1]:
                #             
                ly_obj = Lyrics(word=word)
                ly_obj.time = time
                self.__all_lyric.append(ly_obj)
    
    
        #         
        def get_lyric(self, time: int):
            #            
            if self.__all_lyric:
                print('~~~~~')
                #    ,      
                for item in self.__all_lyric:
                    if item.time < time:
                        return item.word
    
            #      
            #      
            try:
                print('======')
                with open('./files/'+self.__name+'.txt', 'r', encoding='utf-8') as f:
                    line = f.readline()
                    while line:
                        # print(line)
                        self.__split_time_word(line)
                        line = f.readline()
    
                    # __all_lyric          
                    self.__all_lyric.sort(reverse=True)
                    # print(self.__all_lyric)
    
                    #       
                    for item in self.__all_lyric:
                        if item.time < time:
                            return item.word
    
            except FileNotFoundError:
                print('       ')
    
    
    #     -->       -->
    ly_lan = LyricsAnalysis('   ')
    print(ly_lan.get_lyric(10))
    print(ly_lan.get_lyric(12))
    print(ly_lan.get_lyric(20))
    print(ly_lan.get_lyric(30))
    
    #     -->       -->
    # ly_qi = LyricsAnalysis('   ')