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] ].