U C^2@sddlmZddlZddlZddlmZedjZe d dZ dd Z d d Z d d ZddZddZddZddZddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1Z e fd2d3Z!d4d5Z"d6d7Z#ej$eej%eej&eej'eej(eej)eej*eej+eej,eej-eej.e ej/e!ej0e"ej1e#ej2eej3eej4e ej5e ej6eej7eej8eej9eej:eej;eejr )r Zbracketsr r r is_bracket7sr*cCs d}||kS)N)"'`«»‘’‚‛“”„‟‹›❮❯''``r )r quotesr r ris_quote<sr?cCs d}||kS)N)r"r$r&r(r+r,r.r0r2r3r4r6r7r8r:r=r )r Z left_punctr r r is_left_punctUsr@cCs d}||kS)N) r#r%r'r)r+r,r/r1r5r9r;r<r )r Z right_punctr r ris_right_punctksrAcCs"|D]}t|dkrdSqdS)NZScFT)rrr r r r is_currencypsrBcCs tt|SN)bool _like_email)r r r r like_emailxsrFcCs|ds|drdS|dr2t|dkr2dS|ddksJ|ddkrNd Sd |krZd Stt|D]}||dkrfqqfd S|dd d d d d}|d rdS|r|tkrdSd S)Nzhttp://zhttps://Tzwww.rrF@r:r)r lenrangersplitrendswithisalpha_tlds)r itldr r rlike_url|s$  rScCst|dkrdSg}d}d}d}|D]^}|rD|r>d}qVd}n|rRd}n|}||krh|d7}nd}|}|d kr$||q$d|S) NdLONGrrXxdr)rKrOisupperrappendjoin)r shapelastZ shape_charseqr r r r word_shapes*   r`cCs|SrClowerstringr r rrbsrbcCs|dSNrr rcr r rprefixsrfcCs |ddS)Nr rcr r rsuffixsrhcCsdSrer rcr r rclustersricCs|SrC)rOrcr r ris_alphasrjcCs|SrC)rrcr r ris_digitsrkcCs|SrC)islowerrcr r ris_lowersrmcCs|SrC)isspacercr r ris_spacesrocCs|SrC)istitlercr r ris_titlesrqcCs|SrC)rZrcr r ris_uppersrrcCs ||kSrCra)rdZstopsr r ris_stopsrscCsdS)NTr rcr r ris_oovsrtcCsdS)Ng4r rcr r rget_probsru)> __future__rrrerrcompilematchrEsetrrPrrr!r*r?r@rArBrFrSr`rbrfrhrirjrkrmrorqrrrsrtruZLOWERZNORMPREFIXZSUFFIXZCLUSTERZIS_ALPHAZIS_DIGITZIS_LOWERZIS_SPACEZIS_TITLEZIS_UPPERZIS_STOPZIS_OOVZPROBZ LIKE_EMAILZLIKE_NUMZIS_PUNCTZIS_ASCIIZSHAPEZ IS_BRACKETZIS_QUOTEZ IS_LEFT_PUNCTZIS_RIGHT_PUNCTZ IS_CURRENCYZLIKE_URLZ LEX_ATTRSr r r rs