Grammalecte  Hex Artifact Content

Artifact a2c42f5f3ea0b02b87567002370a1b8d586ca97cba9615b46351be4ed80b5d66:

  • File graphspell/tokenizer.py — part of check-in [1bdedd3133] at 2019-09-01 08:22:01 on branch trunk — [graphspell] tokenizer: handles all kinds of apostrophes (user: olr size: 3159) [more...]

0000: 22 22 22 0a 56 65 72 79 20 73 69 6d 70 6c 65 20  """.Very simple 
0010: 74 6f 6b 65 6e 69 7a 65 72 0a 75 73 69 6e 67 20  tokenizer.using 
0020: 72 65 67 75 6c 61 72 20 65 78 70 72 65 73 73 69  regular expressi
0030: 6f 6e 73 0a 22 22 22 0a 0a 69 6d 70 6f 72 74 20  ons."""..import 
0040: 72 65 0a 0a 5f 50 41 54 54 45 52 4e 53 20 3d 20  re.._PATTERNS = 
0050: 7b 0a 20 20 20 20 22 64 65 66 61 75 6c 74 22 3a  {.    "default":
0060: 0a 20 20 20 20 20 20 20 20 28 0a 20 20 20 20 20  .        (.     
0070: 20 20 20 20 20 20 20 72 27 28 3f 50 3c 46 4f 4c         r'(?P<FOL
0080: 44 45 52 55 4e 49 58 3e 2f 28 3f 3a 62 69 6e 7c  DERUNIX>/(?:bin|
0090: 62 6f 6f 74 7c 64 65 76 7c 65 74 63 7c 68 6f 6d  boot|dev|etc|hom
00a0: 65 7c 6c 69 62 7c 6d 6e 74 7c 6f 70 74 7c 72 6f  e|lib|mnt|opt|ro
00b0: 6f 74 7c 73 62 69 6e 7c 74 6d 70 7c 75 73 72 7c  ot|sbin|tmp|usr|
00c0: 76 61 72 7c 42 75 72 65 61 75 7c 44 6f 63 75 6d  var|Bureau|Docum
00d0: 65 6e 74 73 7c 49 6d 61 67 65 73 7c 4d 75 73 69  ents|Images|Musi
00e0: 71 75 65 7c 50 75 62 6c 69 63 7c 54 c3 a9 6c c3  que|Public|T..l.
00f0: a9 63 68 61 72 67 65 6d 65 6e 74 73 7c 56 69 64  .chargements|Vid
0100: c3 a9 6f 73 29 28 3f 3a 2f 5b 5c 77 2e 28 29 2d  ..os)(?:/[\w.()-
0110: 5d 2b 29 2a 29 27 2c 0a 20 20 20 20 20 20 20 20  ]+)*)',.        
0120: 20 20 20 20 72 27 28 3f 50 3c 46 4f 4c 44 45 52      r'(?P<FOLDER
0130: 57 49 4e 3e 5b 61 2d 7a 41 2d 5a 5d 3a 5c 5c 28  WIN>[a-zA-Z]:\\(
0140: 3f 3a 50 72 6f 67 72 61 6d 20 46 69 6c 65 73 28  ?:Program Files(
0150: 3f 3a 20 5b 28 5d 78 38 36 5b 29 5d 7c 29 7c 5b  ?: [(]x86[)]|)|[
0160: 5c 77 2e 28 29 5d 2b 29 28 3f 3a 5c 5c 5b 5c 77  \w.()]+)(?:\\[\w
0170: 2e 28 29 2d 5d 2b 29 2a 29 27 2c 0a 20 20 20 20  .()-]+)*)',.    
0180: 20 20 20 20 20 20 20 20 72 27 28 3f 50 3c 50 55          r'(?P<PU
0190: 4e 43 3e 5b 5d 5b 2c 2e 3b 3a 21 3f e2 80 a6 c2  NC>[][,.;:!?....
01a0: ab c2 bb e2 80 9c e2 80 9d e2 80 98 e2 80 99 22  ..............."
01b0: 28 29 7b 7d c2 b7 e2 80 93 e2 80 94 c2 bf c2 a1  (){}............
01c0: 5d 29 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ])',.           
01d0: 20 72 27 28 3f 50 3c 57 4f 52 44 5f 41 43 52 4f   r'(?P<WORD_ACRO
01e0: 4e 59 4d 3e 5b 41 2d 5a 5d 5b 2e 5d 5b 41 2d 5a  NYM>[A-Z][.][A-Z
01f0: 5d 5b 2e 5d 28 3f 3a 5b 41 2d 5a 5d 5b 2e 5d 29  ][.](?:[A-Z][.])
0200: 2a 29 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20  *)',.           
0210: 20 72 27 28 3f 50 3c 4c 49 4e 4b 3e 28 3f 3a 68   r'(?P<LINK>(?:h
0220: 74 74 70 73 3f 3a 2f 2f 7c 77 77 77 5b 2e 5d 7c  ttps?://|www[.]|
0230: 5c 77 2b 5b 40 2e 5d 5c 77 5c 77 2b 5b 40 2e 5d  \w+[@.]\w\w+[@.]
0240: 29 5c 77 5b 5c 77 2e 2f 3f 26 21 25 3d 2b 2a 22  )\w[\w./?&!%=+*"
0250: 5c 27 40 24 23 2d 5d 2b 29 27 2c 0a 20 20 20 20  \'@$#-]+)',.    
0260: 20 20 20 20 20 20 20 20 72 27 28 3f 50 3c 48 41          r'(?P<HA
0270: 53 48 54 41 47 3e 5b 23 40 5d 5b 5c 77 2d 5d 2b  SHTAG>[#@][\w-]+
0280: 29 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )',.            
0290: 72 27 28 3f 50 3c 48 54 4d 4c 3e 3c 5c 77 2b 2e  r'(?P<HTML><\w+.
02a0: 2a 3f 3e 7c 3c 2f 5c 77 2b 20 2a 3e 29 27 2c 0a  *?>|</\w+ *>)',.
02b0: 20 20 20 20 20 20 20 20 20 20 20 20 72 27 28 3f              r'(?
02c0: 50 3c 50 53 45 55 44 4f 48 54 4d 4c 3e 5c 5b 2f  P<PSEUDOHTML>\[/
02d0: 3f 5c 77 2b 5c 5d 29 27 2c 0a 20 20 20 20 20 20  ?\w+\])',.      
02e0: 20 20 20 20 20 20 72 27 28 3f 50 3c 48 4f 55 52        r'(?P<HOUR
02f0: 3e 5c 64 5c 64 3f 5b 68 3a 5d 5c 64 5c 64 28 3f  >\d\d?[h:]\d\d(?
0300: 3a 5b 6d 3a 5d 5c 64 5c 64 73 3f 7c 29 5c 62 29  :[m:]\d\ds?|)\b)
0310: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ',.            r
0320: 27 28 3f 50 3c 4e 55 4d 3e 5c 64 2b 28 3f 3a 5b  '(?P<NUM>\d+(?:[
0330: 2e 2c 5d 5c 64 2b 29 29 27 2c 0a 20 20 20 20 20  .,]\d+))',.     
0340: 20 20 20 20 20 20 20 72 27 28 3f 50 3c 53 49 47         r'(?P<SIG
0350: 4e 3e 5b 26 25 e2 80 b0 e2 82 ac 24 2b c2 b1 3d  N>[&%......$+..=
0360: 2a 2f 3c 3e e2 a9 be e2 a9 bd 23 7c c3 97 c2 a5  */<>......#|....
0370: c2 a3 c2 a7 c2 a2 c2 ac c3 b7 40 2d 5d 29 27 2c  ..........@-])',
0380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 22 28  .            r"(
0390: 3f 50 3c 57 4f 52 44 3e 5c 77 2b 28 3f 3a 5b e2  ?P<WORD>\w+(?:[.
03a0: 80 99 27 60 2d 5d 5c 77 2b 29 2a 29 22 0a 20 20  ..'`-]\w+)*)".  
03b0: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 22 66 72        ),.    "fr
03c0: 22 3a 0a 20 20 20 20 20 20 20 20 28 0a 20 20 20  ":.        (.   
03d0: 20 20 20 20 20 20 20 20 20 72 27 28 3f 50 3c 46           r'(?P<F
03e0: 4f 4c 44 45 52 55 4e 49 58 3e 2f 28 3f 3a 62 69  OLDERUNIX>/(?:bi
03f0: 6e 7c 62 6f 6f 74 7c 64 65 76 7c 65 74 63 7c 68  n|boot|dev|etc|h
0400: 6f 6d 65 7c 6c 69 62 7c 6d 6e 74 7c 6f 70 74 7c  ome|lib|mnt|opt|
0410: 72 6f 6f 74 7c 73 62 69 6e 7c 74 6d 70 7c 75 73  root|sbin|tmp|us
0420: 72 7c 76 61 72 7c 42 75 72 65 61 75 7c 44 6f 63  r|var|Bureau|Doc
0430: 75 6d 65 6e 74 73 7c 49 6d 61 67 65 73 7c 4d 75  uments|Images|Mu
0440: 73 69 71 75 65 7c 50 75 62 6c 69 63 7c 54 c3 a9  sique|Public|T..
0450: 6c c3 a9 63 68 61 72 67 65 6d 65 6e 74 73 7c 56  l..chargements|V
0460: 69 64 c3 a9 6f 73 29 28 3f 3a 2f 5b 5c 77 2e 28  id..os)(?:/[\w.(
0470: 29 2d 5d 2b 29 2a 29 27 2c 0a 20 20 20 20 20 20  )-]+)*)',.      
0480: 20 20 20 20 20 20 72 27 28 3f 50 3c 46 4f 4c 44        r'(?P<FOLD
0490: 45 52 57 49 4e 3e 5b 61 2d 7a 41 2d 5a 5d 3a 5c  ERWIN>[a-zA-Z]:\
04a0: 5c 28 3f 3a 50 72 6f 67 72 61 6d 20 46 69 6c 65  \(?:Program File
04b0: 73 28 3f 3a 20 5b 28 5d 78 38 36 5b 29 5d 7c 29  s(?: [(]x86[)]|)
04c0: 7c 5b 5c 77 2e 28 29 5d 2b 29 28 3f 3a 5c 5c 5b  |[\w.()]+)(?:\\[
04d0: 5c 77 2e 28 29 2d 5d 2b 29 2a 29 27 2c 0a 20 20  \w.()-]+)*)',.  
04e0: 20 20 20 20 20 20 20 20 20 20 72 27 28 3f 50 3c            r'(?P<
04f0: 50 55 4e 43 3e 5b 5d 5b 2c 2e 3b 3a 21 3f e2 80  PUNC>[][,.;:!?..
0500: a6 c2 ab c2 bb e2 80 9c e2 80 9d e2 80 98 e2 80  ................
0510: 99 22 28 29 7b 7d c2 b7 e2 80 93 e2 80 94 c2 bf  ."(){}..........
0520: c2 a1 5d 29 27 2c 0a 20 20 20 20 20 20 20 20 20  ..])',.         
0530: 20 20 20 72 27 28 3f 50 3c 57 4f 52 44 5f 41 43     r'(?P<WORD_AC
0540: 52 4f 4e 59 4d 3e 5b 41 2d 5a 5d 5b 2e 5d 5b 41  RONYM>[A-Z][.][A
0550: 2d 5a 5d 5b 2e 5d 28 3f 3a 5b 41 2d 5a 5d 5b 2e  -Z][.](?:[A-Z][.
0560: 5d 29 2a 29 27 2c 0a 20 20 20 20 20 20 20 20 20  ])*)',.         
0570: 20 20 20 72 27 28 3f 50 3c 4c 49 4e 4b 3e 28 3f     r'(?P<LINK>(?
0580: 3a 68 74 74 70 73 3f 3a 2f 2f 7c 77 77 77 5b 2e  :https?://|www[.
0590: 5d 7c 5c 77 2b 5b 40 2e 5d 5c 77 5c 77 2b 5b 40  ]|\w+[@.]\w\w+[@
05a0: 2e 5d 29 5c 77 5b 5c 77 2e 2f 3f 26 21 25 3d 2b  .])\w[\w./?&!%=+
05b0: 2a 22 5c 27 40 24 23 2d 5d 2b 29 27 2c 0a 20 20  *"\'@$#-]+)',.  
05c0: 20 20 20 20 20 20 20 20 20 20 72 27 28 3f 50 3c            r'(?P<
05d0: 48 41 53 48 54 41 47 3e 5b 23 40 5d 5b 5c 77 2d  HASHTAG>[#@][\w-
05e0: 5d 2b 29 27 2c 0a 20 20 20 20 20 20 20 20 20 20  ]+)',.          
05f0: 20 20 72 27 28 3f 50 3c 48 54 4d 4c 3e 3c 5c 77    r'(?P<HTML><\w
0600: 2b 2e 2a 3f 3e 7c 3c 2f 5c 77 2b 20 2a 3e 29 27  +.*?>|</\w+ *>)'
0610: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 27  ,.            r'
0620: 28 3f 50 3c 50 53 45 55 44 4f 48 54 4d 4c 3e 5c  (?P<PSEUDOHTML>\
0630: 5b 2f 3f 5c 77 2b 5c 5d 29 27 2c 0a 20 20 20 20  [/?\w+\])',.    
0640: 20 20 20 20 20 20 20 20 72 22 28 3f 50 3c 57 4f          r"(?P<WO
0650: 52 44 5f 45 4c 49 44 45 44 3e 28 3f 3a 6c 7c 64  RD_ELIDED>(?:l|d
0660: 7c 6e 7c 6d 7c 74 7c 73 7c 6a 7c 63 7c c3 a7 7c  |n|m|t|s|j|c|..|
0670: 6c 6f 72 73 71 75 7c 70 75 69 73 71 75 7c 6a 75  lorsqu|puisqu|ju
0680: 73 71 75 7c 71 75 6f 69 71 75 7c 71 75 7c 70 72  squ|quoiqu|qu|pr
0690: 65 73 71 75 7c 71 75 65 6c 71 75 29 5b 27 e2 80  esqu|quelqu)['..
06a0: 99 c2 b4 e2 80 98 e2 80 b2 60 ca bc 5d 29 22 2c  .........`..])",
06b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 27 28  .            r'(
06c0: 3f 50 3c 57 4f 52 44 5f 4f 52 44 49 4e 41 4c 3e  ?P<WORD_ORDINAL>
06d0: 5c 64 2b 28 3f 3a 65 72 73 3f 7c 72 65 73 3f 7c  \d+(?:ers?|res?|
06e0: c3 a8 5b 72 6d 5d 65 73 3f 7c 69 5b c3 a8 65 5d  ..[rm]es?|i[..e]
06f0: 5b 6d 72 5d 65 73 3f 7c 64 65 3f 73 3f 7c 6e 64  [mr]es?|de?s?|nd
0700: 65 3f 73 3f 7c c3 a8 73 3f 7c 65 73 3f 7c e1 b5  e?s?|..s?|es?|..
0710: 89 ca b3 cb a2 3f 7c ca b3 e1 b5 89 cb a2 3f 7c  .....?|.......?|
0720: e1 b5 88 e1 b5 89 3f cb a2 3f 7c e2 81 bf e1 b5  ......?..?|.....
0730: 88 e1 b5 89 3f cb a2 3f 7c e1 b5 89 cb a2 3f 29  ....?..?|.....?)
0740: 5c 62 29 27 2c 0a 20 20 20 20 20 20 20 20 20 20  \b)',.          
0750: 20 20 72 27 28 3f 50 3c 48 4f 55 52 3e 5c 64 5c    r'(?P<HOUR>\d\
0760: 64 3f 5b 68 3a 5d 5c 64 5c 64 28 3f 3a 5b 6d 3a  d?[h:]\d\d(?:[m:
0770: 5d 5c 64 5c 64 73 3f 7c 29 5c 62 29 27 2c 0a 20  ]\d\ds?|)\b)',. 
0780: 20 20 20 20 20 20 20 20 20 20 20 72 27 28 3f 50             r'(?P
0790: 3c 4e 55 4d 3e 5c 64 2b 28 3f 3a 5b 2e 2c 5d 5c  <NUM>\d+(?:[.,]\
07a0: 64 2b 7c 29 29 27 2c 0a 20 20 20 20 20 20 20 20  d+|))',.        
07b0: 20 20 20 20 72 27 28 3f 50 3c 53 49 47 4e 3e 5b      r'(?P<SIGN>[
07c0: 26 25 e2 80 b0 e2 82 ac 24 2b c2 b1 3d 2a 2f 3c  &%......$+..=*/<
07d0: 3e e2 a9 be e2 a9 bd 23 7c c3 97 c2 a5 c2 a3 c2  >......#|.......
07e0: a2 c2 a7 c2 ac c3 b7 40 2d 5d 29 27 2c 0a 20 20  .......@-])',.  
07f0: 20 20 20 20 20 20 20 20 20 20 72 22 28 3f 50 3c            r"(?P<
0800: 57 4f 52 44 3e 5c 77 2b 28 3f 3a 5b e2 80 99 27  WORD>\w+(?:[...'
0810: 60 2d 5d 5c 77 2b 29 2a 29 22 0a 20 20 20 20 20  `-]\w+)*)".     
0820: 20 20 20 29 0a 7d 0a 0a 0a 63 6c 61 73 73 20 54     ).}...class T
0830: 6f 6b 65 6e 69 7a 65 72 3a 0a 20 20 20 20 22 54  okenizer:.    "T
0840: 6f 6b 65 6e 69 7a 65 72 3a 20 74 72 61 6e 73 66  okenizer: transf
0850: 6f 72 6d 73 20 61 20 74 65 78 74 20 69 6e 20 61  orms a text in a
0860: 20 6c 69 73 74 20 6f 66 20 74 6f 6b 65 6e 73 22   list of tokens"
0870: 0a 0a 20 20 20 20 64 65 66 20 5f 5f 69 6e 69 74  ..    def __init
0880: 5f 5f 20 28 73 65 6c 66 2c 20 73 4c 61 6e 67 29  __ (self, sLang)
0890: 3a 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 73  :.        self.s
08a0: 4c 61 6e 67 20 3d 20 73 4c 61 6e 67 0a 20 20 20  Lang = sLang.   
08b0: 20 20 20 20 20 69 66 20 73 4c 61 6e 67 20 6e 6f       if sLang no
08c0: 74 20 69 6e 20 5f 50 41 54 54 45 52 4e 53 3a 0a  t in _PATTERNS:.
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 66              self
08e0: 2e 73 4c 61 6e 67 20 3d 20 22 64 65 66 61 75 6c  .sLang = "defaul
08f0: 74 22 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e  t".        self.
0900: 7a 54 6f 6b 65 6e 20 3d 20 72 65 2e 63 6f 6d 70  zToken = re.comp
0910: 69 6c 65 28 20 22 28 3f 69 29 22 20 2b 20 27 7c  ile( "(?i)" + '|
0920: 27 2e 6a 6f 69 6e 28 73 52 65 67 65 78 20 66 6f  '.join(sRegex fo
0930: 72 20 73 52 65 67 65 78 20 69 6e 20 5f 50 41 54  r sRegex in _PAT
0940: 54 45 52 4e 53 5b 73 4c 61 6e 67 5d 29 20 29 0a  TERNS[sLang]) ).
0950: 0a 20 20 20 20 64 65 66 20 67 65 6e 54 6f 6b 65  .    def genToke
0960: 6e 73 20 28 73 65 6c 66 2c 20 73 54 65 78 74 2c  ns (self, sText,
0970: 20 62 53 74 61 72 74 45 6e 64 54 6f 6b 65 6e 3d   bStartEndToken=
0980: 46 61 6c 73 65 29 3a 0a 20 20 20 20 20 20 20 20  False):.        
0990: 22 67 65 6e 65 72 61 74 6f 72 3a 20 74 6f 6b 65  "generator: toke
09a0: 6e 69 7a 65 20 3c 73 54 65 78 74 3e 22 0a 20 20  nize <sText>".  
09b0: 20 20 20 20 20 20 69 20 3d 20 30 0a 20 20 20 20        i = 0.    
09c0: 20 20 20 20 69 66 20 62 53 74 61 72 74 45 6e 64      if bStartEnd
09d0: 54 6f 6b 65 6e 3a 0a 20 20 20 20 20 20 20 20 20  Token:.         
09e0: 20 20 20 79 69 65 6c 64 20 7b 20 22 69 22 3a 20     yield { "i": 
09f0: 30 2c 20 22 73 54 79 70 65 22 3a 20 22 49 4e 46  0, "sType": "INF
0a00: 4f 22 2c 20 22 73 56 61 6c 75 65 22 3a 20 22 3c  O", "sValue": "<
0a10: 73 74 61 72 74 3e 22 2c 20 22 6e 53 74 61 72 74  start>", "nStart
0a20: 22 3a 20 30 2c 20 22 6e 45 6e 64 22 3a 20 30 2c  ": 0, "nEnd": 0,
0a30: 20 22 6c 4d 6f 72 70 68 22 3a 20 5b 22 3c 73 74   "lMorph": ["<st
0a40: 61 72 74 3e 22 5d 20 7d 0a 20 20 20 20 20 20 20  art>"] }.       
0a50: 20 66 6f 72 20 69 2c 20 6d 20 69 6e 20 65 6e 75   for i, m in enu
0a60: 6d 65 72 61 74 65 28 73 65 6c 66 2e 7a 54 6f 6b  merate(self.zTok
0a70: 65 6e 2e 66 69 6e 64 69 74 65 72 28 73 54 65 78  en.finditer(sTex
0a80: 74 29 2c 20 31 29 3a 0a 20 20 20 20 20 20 20 20  t), 1):.        
0a90: 20 20 20 20 79 69 65 6c 64 20 7b 20 22 69 22 3a      yield { "i":
0aa0: 20 69 2c 20 22 73 54 79 70 65 22 3a 20 6d 2e 6c   i, "sType": m.l
0ab0: 61 73 74 67 72 6f 75 70 2c 20 22 73 56 61 6c 75  astgroup, "sValu
0ac0: 65 22 3a 20 6d 2e 67 72 6f 75 70 28 29 2c 20 22  e": m.group(), "
0ad0: 6e 53 74 61 72 74 22 3a 20 6d 2e 73 74 61 72 74  nStart": m.start
0ae0: 28 29 2c 20 22 6e 45 6e 64 22 3a 20 6d 2e 65 6e  (), "nEnd": m.en
0af0: 64 28 29 20 7d 0a 20 20 20 20 20 20 20 20 69 66  d() }.        if
0b00: 20 62 53 74 61 72 74 45 6e 64 54 6f 6b 65 6e 3a   bStartEndToken:
0b10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 45 6e  .            iEn
0b20: 64 20 3d 20 6c 65 6e 28 73 54 65 78 74 29 0a 20  d = len(sText). 
0b30: 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64             yield
0b40: 20 7b 20 22 69 22 3a 20 69 2b 31 2c 20 22 73 54   { "i": i+1, "sT
0b50: 79 70 65 22 3a 20 22 49 4e 46 4f 22 2c 20 22 73  ype": "INFO", "s
0b60: 56 61 6c 75 65 22 3a 20 22 3c 65 6e 64 3e 22 2c  Value": "<end>",
0b70: 20 22 6e 53 74 61 72 74 22 3a 20 69 45 6e 64 2c   "nStart": iEnd,
0b80: 20 22 6e 45 6e 64 22 3a 20 69 45 6e 64 2c 20 22   "nEnd": iEnd, "
0b90: 6c 4d 6f 72 70 68 22 3a 20 5b 22 3c 65 6e 64 3e  lMorph": ["<end>
0ba0: 22 5d 20 7d 0a 0a 20 20 20 20 64 65 66 20 67 65  "] }..    def ge
0bb0: 74 54 6f 6b 65 6e 54 79 70 65 73 20 28 73 65 6c  tTokenTypes (sel
0bc0: 66 29 3a 0a 20 20 20 20 20 20 20 20 22 72 65 74  f):.        "ret
0bd0: 75 72 6e 73 20 6c 69 73 74 20 6f 66 20 74 6f 6b  urns list of tok
0be0: 65 6e 20 74 79 70 65 73 20 61 73 20 74 75 70 6c  en types as tupl
0bf0: 65 20 28 74 6f 6b 65 6e 20 6e 61 6d 65 2c 20 72  e (token name, r
0c00: 65 67 65 78 29 22 0a 20 20 20 20 20 20 20 20 72  egex)".        r
0c10: 65 74 75 72 6e 20 5b 20 73 52 65 67 65 78 5b 34  eturn [ sRegex[4
0c20: 3a 2d 31 5d 2e 73 70 6c 69 74 28 22 3e 22 29 20  :-1].split(">") 
0c30: 20 66 6f 72 20 73 52 65 67 65 78 20 69 6e 20 5f   for sRegex in _
0c40: 50 41 54 54 45 52 4e 53 5b 73 65 6c 66 2e 73 4c  PATTERNS[self.sL
0c50: 61 6e 67 5d 20 5d 0a                             ang] ].