Skip to content

Instantly share code, notes, and snippets.

@edufelipe
Created December 5, 2014 01:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save edufelipe/665359688fa7beabd70e to your computer and use it in GitHub Desktop.
Save edufelipe/665359688fa7beabd70e to your computer and use it in GitHub Desktop.
Generate a Regular Expression containing all common timezones from pytz
from collections import OrderedDict
def make_tree(strings):
"""Take a list of strings and returns a dict tree with chars as keys.
>>> make_tree(['cat', 'car', 'dog'])
{'c': {'a': {'r': {}, 't': {}}}, 'd': {'o': {'g': {}}}}
"""
root = branch = OrderedDict()
for s in strings:
s = s.replace('/', r'\\/')
for i in range(len(s)):
if s[i] not in branch:
branch[s[i]] = OrderedDict()
branch = branch[s[i]]
branch = root
return root
def make_regex(tree):
"""Return a regular expression that matches the tree minimal tree.
>>> mate_regex({'c': {'a': {'r': {}, 't': {}}}, 'd': {'o': {'g': {}}}})
(?:ca(?:t|r)|dog)
"""
inner = '|'.join(k + make_regex(v) for k, v in tree.items())
if len(tree) > 1:
return '(?:%s)' % inner
return inner
if __name__ == '__main__':
import pytz
print make_regex(make_tree(pytz.common_timezones))
@edufelipe
Copy link
Author

Currently the output is

(?:A(?:frica\\/(?:A(?:bidjan|ccra|ddis_Ababa|lgiers|smara)|B(?:a(?:mako|n(?:gui|jul))|issau|lantyre|razzaville|ujumbura)|C(?:a(?:iro|sablanca)|euta|onakry)|D(?:a(?:kar|r_es_Salaam)|jibouti|ouala)|El_Aaiun|Freetown|Gaborone|Harare|J(?:ohannesburg|uba)|K(?:ampala|hartoum|i(?:gali|nshasa))|L(?:agos|ibreville|ome|u(?:anda|bumbashi|saka))|M(?:a(?:labo|puto|seru)|babane|o(?:gadishu|nrovia))|N(?:airobi|djamena|iamey|ouakchott)|Ouagadougou|Porto-Novo|Sao_Tome|T(?:ripoli|unis)|Windhoek)|merica\\/(?:A(?:dak|n(?:chorage|guilla|tigua)|r(?:aguaina|gentina\\/(?:Buenos_Aires|C(?:atamarca|ordoba)|Jujuy|La_Rioja|Mendoza|Rio_Gallegos|Sa(?:lta|n_(?:Juan|Luis))|Tucuman|Ushuaia)|uba)|suncion|tikokan)|B(?:a(?:hia_Banderas|rbados)|el(?:em|ize)|lanc-Sablon|o(?:a_Vista|gota|ise))|C(?:a(?:m(?:bridge_Bay|po_Grande)|ncun|racas|y(?:enne|man))|hi(?:cago|huahua)|osta_Rica|reston|u(?:iaba|racao))|D(?:a(?:nmarkshavn|wson_Creek)|e(?:nver|troit)|ominica)|E(?:dmonton|irunepe|l_Salvador)|Fortaleza|G(?:lace_Bay|o(?:dthab|ose_Bay)|r(?:and_Turk|enada)|u(?:a(?:deloupe|temala|yaquil)|yana))|H(?:a(?:lifax|vana)|ermosillo)|I(?:n(?:diana\\/(?:Indianapolis|Knox|Marengo|Petersburg|Tell_City|V(?:evay|incennes)|Winamac)|uvik)|qaluit)|J(?:amaica|uneau)|K(?:entucky\\/(?:Louisville|Monticello)|ralendijk)|L(?:a_Paz|ima|o(?:s_Angeles|wer_Princes))|M(?:a(?:ceio|na(?:gua|us)|r(?:igot|tinique)|tamoros|zatlan)|e(?:nominee|rida|tlakatla|xico_City)|iquelon|on(?:cton|t(?:e(?:rrey|video)|real|serrat)))|N(?:assau|ew_York|ipigon|o(?:me|r(?:onha|th_Dakota\\/(?:Beulah|Center|New_Salem))))|Ojinaga|P(?:a(?:n(?:ama|gnirtung)|ramaribo)|hoenix|ort(?:-au-Prince|_of_Spain|o_Velho)|uerto_Rico)|R(?:a(?:iny_River|nkin_Inlet)|e(?:cife|gina|solute)|io_Branco)|S(?:a(?:nt(?:a(?:_Isabel|rem)|iago|o_Domingo)|o_Paulo)|coresbysund|itka|t_(?:Barthelemy|Johns|Kitts|Lucia|Thomas|Vincent)|wift_Current)|T(?:egucigalpa|hu(?:le|nder_Bay)|ijuana|or(?:onto|tola))|Vancouver|W(?:hitehorse|innipeg)|Y(?:akutat|ellowknife))|ntarctica\\/(?:Casey|D(?:avis|umontDUrville)|M(?:a(?:cquarie|wson)|cMurdo)|Palmer|Rothera|Syowa|Troll|Vostok)|rctic\\/Longyearbyen|sia\\/(?:A(?:den|lmaty|mman|nadyr|qt(?:au|obe)|shgabat)|B(?:a(?:ghdad|hrain|ku|ngkok)|eirut|ishkek|runei)|C(?:h(?:ita|oibalsan)|olombo)|D(?:amascus|haka|ili|u(?:bai|shanbe))|Gaza|H(?:ebron|o(?:_Chi_Minh|ng_Kong|vd))|Irkutsk|J(?:a(?:karta|yapura)|erusalem)|K(?:a(?:bul|mchatka|rachi|thmandu)|handyga|olkata|rasnoyarsk|u(?:ala_Lumpur|ching|wait))|M(?:a(?:cau|gadan|kassar|nila)|uscat)|N(?:icosia|ovo(?:kuznetsk|sibirsk))|O(?:msk|ral)|P(?:hnom_Penh|ontianak|yongyang)|Q(?:atar|yzylorda)|R(?:angoon|iyadh)|S(?:a(?:khalin|markand)|eoul|hanghai|ingapore|rednekolymsk)|T(?:a(?:ipei|shkent)|bilisi|ehran|himphu|okyo)|U(?:laanbaatar|rumqi|st-Nera)|V(?:ientiane|ladivostok)|Y(?:akutsk|e(?:katerinburg|revan)))|tlantic\\/(?:Azores|Bermuda|Ca(?:nary|pe_Verde)|Faroe|Madeira|Reykjavik|S(?:outh_Georgia|t(?:_Helena|anley)))|ustralia\\/(?:Adelaide|Br(?:isbane|oken_Hill)|Currie|Darwin|Eucla|Hobart|L(?:indeman|ord_Howe)|Melbourne|Perth|Sydney))|Canada\\/(?:Atlantic|Central|Eastern|Mountain|Newfoundland|Pacific)|Europe\\/(?:A(?:msterdam|ndorra|thens)|B(?:e(?:lgrade|rlin)|r(?:atislava|ussels)|u(?:charest|dapest|singen))|C(?:hisinau|openhagen)|Dublin|G(?:ibraltar|uernsey)|Helsinki|Is(?:le_of_Man|tanbul)|Jersey|K(?:aliningrad|iev)|L(?:isbon|jubljana|ondon|uxembourg)|M(?:a(?:drid|lta|riehamn)|insk|o(?:naco|scow))|Oslo|P(?:aris|odgorica|rague)|R(?:iga|ome)|S(?:a(?:mara|n_Marino|rajevo)|imferopol|kopje|ofia|tockholm)|T(?:allinn|irane)|Uzhgorod|V(?:a(?:duz|tican)|i(?:enna|lnius)|olgograd)|Warsaw|Z(?:a(?:greb|porozhye)|urich))|GMT|Indian\\/(?:Antananarivo|C(?:h(?:agos|ristmas)|o(?:cos|moro))|Kerguelen|Ma(?:he|ldives|uritius|yotte)|Reunion)|Pacific\\/(?:A(?:pia|uckland)|Bougainville|Ch(?:atham|uuk)|E(?:aster|fate|nderbury)|F(?:akaofo|iji|unafuti)|G(?:a(?:lapagos|mbier)|ua(?:dalcanal|m))|Honolulu|Johnston|K(?:iritimati|osrae|wajalein)|M(?:a(?:juro|rquesas)|idway)|N(?:auru|iue|o(?:rfolk|umea))|P(?:a(?:go_Pago|lau)|itcairn|o(?:hnpei|rt_Moresby))|Rarotonga|Saipan|T(?:a(?:hiti|rawa)|ongatapu)|Wa(?:ke|llis))|U(?:S\\/(?:A(?:laska|rizona)|Central|Eastern|Hawaii|Mountain|Pacific)|TC))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment