<commit_before>{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Регулярні вирази, for fun and profit\n",
    "\n",
    "<NAME>\n",
    "\n",
    "1. Що таке регулярні вирази?\n",
    "2. Найбільш поширені приклади\n",
    "  * метасимволи - . ^ $ * + ? { } [ ] \\ | ( )\n",
    "  * класи \\d \\D \\s \\w \\W\n",
    "  \n",
    "3. Практичне застосування для аналізу текстів\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "RegEx (РегВир) - це правило (шаблон), за яким ви вказуєте як вибирати з тектсу необхідні вам фрагменти. Цікаво, що regexes - це мінімалістична мова програмування\n",
    "\n",
    "```\n",
    ". - будь який символ\n",
    "^ - початок строки \n",
    "$ - кінець строки \n",
    "* - повторити попередній символ **нуль** або більше разів\n",
    "+ - повторити попередній символ **один** або більше разів \n",
    "? - попередній символ є, або його немає  \n",
    "{} - інтервал повторів, {1,2} - попередній символ може зустрітися 1 або два рази поспіль \n",
    "[] - класи символів, може бути через тире. Наприклад, [0-9] - всі цифри  \n",
    "\\ - екран\n",
    "| - або \n",
    "( ) - поіменовані групи символів\n",
    "```\n",
    "\n",
    "[Regex'и & Python](http://nbviewer.jupyter.org/github/rasbt/python_reference/blob/master/tutorials/useful_regex.ipynb#A-collection-of-useful-regular-expressions) \n",
    "\n",
    "* re.match() : шукати RE на початку строки\n",
    "* re.search() : шукати RE будь де у строці\n",
    "* re.findall() : знайти всі співпадіння, повернути список\n",
    "* re.finditer() : Find all substrings where the RE matches, and returns them as an iterator.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['luck', 'duck']\n"
     ]
    }
   ],
   "source": [
    "import re\n",
    "\n",
    "text = \"\"\"\n",
    "I'd like to test my luck, where is a duck\n",
    "\"\"\"\n",
    "\n",
    "comp = re.compile(r'.?uck')    \n",
    "match = comp.findall(text)\n",
    "print( match )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<NAME>\n",
      "Сбербанку Росії\n",
      "Ріната Ахметова\n"
     ]
    }
   ],
   "source": [
    "news = u\"\"\"\n",
    "Після погромів у російських банках на допит викликають комбата \"ОУН\"\n",
    "24.02.2016 | 14:21\n",
    "<NAME>ького викликали у якості підозрюваного.\n",
    "Сьогодні в МВС на допит викликали командира добровольчого батальону \"ОУН\". Про це повідомляє ТСН.ua.\n",
    "МВС розслідує причетність Коханівського до погромів у російських банках. Повістку комбат вже отримав.\n",
    "За інформацією видання, комбата бачили серед чоловіків, які влаштували безлади у приміщеннях. Як уже повідомлялося, співробітники поліції вже встановили десятьох учасників атак на російські банки у Києві. Це жителі столиці 1998 і 1999 років народження.\n",
    "Нагадаємо, 20 лютого в центрі Києва невідомі особи камінням розбили скло у вітринах \"Альфа-банку\", \"Сбербанку Росії\" і в офісі бізнесмена Ріната Ахметова. \n",
    "Повідомлялося, що за цими трьома фактами було відкрито кримінальні провадження за ст. 296 (хуліганство) Кримінального кодексу України.\n",
    "Детальніше читайте на УНІАН: http://www.unian.ua/society/1274351-pislya-pogromiv-u-rosiyskih-bankah-na-dopit-viklikayut-kombata-oun.html\n",
    "\"\"\"\n",
    "\n",
    "def ppp(lst):\n",
    "    \"\"\" супер функція для друку результатів \"\"\"    \n",
    "    for li in lst:\n",
    "        print(li)\n",
    "\n",
    "# find names\n",
    "match = re.findall(u'(?u)[А-Я]\\w*\\s+[А-Я]\\w*', news)\n",
    "ppp(match)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ст. 296\n"
     ]
    }
   ],
   "source": [
    "# find criminal articles\n",
    "match = re.findall(ur'(?u)ст\\. \\d{1,5}', news)\n",
    "ppp(match)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "24.02.2016\n"
     ]
    }
   ],
   "source": [
    "# find date\n",
    "match = re.findall(ur'(?u)\\d{1,2}\\.\\d{1,2}.\\d{2,4}', news)\n",
    "ppp(match)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\"ОУН\"\n",
      "\"ОУН\"\n",
      "\"Альфа-банку\"\n",
      "\"Сбербанку Росії\"\n"
     ]
    }
   ],
   "source": [
    "#best trick in regex: Not_this_context|(WeWantThis)\n",
    "#match = re.findall(u'(?u)комбата|комбату|(комбат)', news)\n",
    "#match = re.findall(u'(?u)(?<=\").+?(?=\")', news) # positive loockahead and lookbehind\n",
    "\n",
    "# все лапках\n",
    "match = re.findall(u'(?u)\".+?\"', news)\n",
    "ppp(match)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "RegExи зустрічаються всюди - навіть у екселі (Find & Replace). Класний приклад аналізу: [Електронна пошта Гіларі](https://github.com/datahoarder/secretary-clinton-email-dump/blob/master/README.md)\n",
    " "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# всі долари у світі!\n",
    "!ag '\\$\\d+' ./clinton"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     14 http://www.messagelabs.com/email\r\n",
      "      6 http://www.nio.gov.uk/the-agreement\r\n",
      "      6 http://www.guardian.co.uk/uk/northernireland\r\n",
      "      6 http://www.guardian.co.uk/profile/henrymcdonald\r\n",
      "      6 http://www.guardian.co.uk/politics/sinn-fein\r\n",
      "      6 http://www.guardian.co.uk/politics/dup\r\n",
      "      6 http://www.guardian.co.uk/politics/2010/feb/05/northern-ireland-dup-ulsterdeal\r\n",
      "      6 http://www.guardian.co.uk/help/accessibility\r\n",
      "      6 http://static.guim.co.uk/sysimages/Guardian/Pix/pictures/2010/2/5/1265368562294/Gordon-Brown-Peter-Robins-001.jpg\r\n",
      "      5 http://www.huffingtonpost.com/\r\n",
      "      4 http://www.youtube.com/nicholaskristof\r\n",
      "      4 http://www.tomdispatch.com/blog/175334/\r\n",
      "      4 http://www.sipri.org/research/armaments/milex/resultoutput/trends\r\n",
      "      4 http://www.sipri.org/research/armaments/milex/resultoutput/trendgraphs/Top1Obubble/top1Obubble2009/image_vi\r\n",<commit_msg>minor updates 4 regex notebook<commit_after>{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Регулярні вирази, for fun and profit\n",
    "\n",
    "<NAME>яття\n",
    "\n",
    "1. Що таке регулярні вирази?\n",
    "2. Найбільш поширені приклади\n",
    "  * метасимволи - . ^ $ * + ? { } [ ] \\ | ( )\n",
    "  * класи \\d \\D \\s \\w \\W\n",
    "  \n",
    "3. Практичне застосування для аналізу текстів\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "RegEx (РегВир) - це правило (шаблон), за яким ви вказуєте як вибирати з тектсу необхідні вам фрагменти. Цікаво, що regexes - це мінімалістична мова програмування\n",
    "\n",
    "```\n",
    ". - будь який символ\n",
    "^ - початок строки \n",
    "$ - кінець строки \n",
    "* - повторити попередній символ **нуль** або більше разів\n",
    "+ - повторити попередній символ **один** або більше разів \n",
    "? - попередній символ є, або його немає  \n",
    "{} - інтервал повторів, {1,2} - попередній символ може зустрітися 1 або два рази поспіль \n",
    "[] - класи символів, може бути через тире. Наприклад, [0-9] - всі цифри  \n",
    "\\ - екран (наприклад, ставте \\ перед + щоб знайти саме \"+\", як знак )\n",
    "| - або: напр. \"зрада|перемога\" знайде у тексті або \"зрада\", або \"перемога\"  \n",
    "( ) - поіменовані групи символів\n",
    "```\n",
    "\n",
    "[Regex'и & Python](http://nbviewer.jupyter.org/github/rasbt/python_reference/blob/master/tutorials/useful_regex.ipynb#A-collection-of-useful-regular-expressions) \n",
    "\n",
    "* re.match() : шукати RE на початку строки\n",
    "* re.search() : шукати RE будь де у строці\n",
    "* re.findall() : знайти всі співпадіння, повернути список\n",
    "* re.finditer() : Find all substrings where the RE matches, and returns them as an iterator.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['luck', 'duck']\n"
     ]
    }
   ],
   "source": [
    "import re\n",
    "\n",
    "text = \"\"\"\n",
    "I'd like to test my luck, where is a duck\n",
    "\"\"\"\n",
    "\n",
    "comp = re.compile(r'.?uck')    # знайти  строці все, що має закінчення uck\n",
    "match = comp.findall(text)\n",
    "print( match )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<NAME>\n",
      "Сбербанку Росії\n",
      "Ріната Ахметова\n"
     ]
    }
   ],
   "source": [
    "# текст новини\n",
    "news = u\"\"\"\n",
    "Після погромів у російських банках на допит викликають комбата \"ОУН\"\n",
    "24.02.2016 | 14:21\n",
    "<NAME> викликали у якості підозрюваного.\n",
    "Сьогодні в МВС на допит викликали командира добровольчого батальону \"ОУН\". Про це повідомляє ТСН.ua.\n",
    "МВС розслідує причетність Коханівського до погромів у російських банках. Повістку комбат вже отримав.\n",
    "За інформацією видання, комбата бачили серед чоловіків, які влаштували безлади у приміщеннях. Як уже повідомлялося, співробітники поліції вже встановили десятьох учасників атак на російські банки у Києві. Це жителі столиці 1998 і 1999 років народження.\n",
    "Нагадаємо, 20 лютого в центрі Києва невідомі особи камінням розбили скло у вітринах \"Альфа-банку\", \"Сбербанку Росії\" і в офісі бізнесмена Ріната Ахметова. \n",
    "Повідомлялося, що за цими трьома фактами було відкрито кримінальні провадження за ст. 296 (хуліганство) Кримінального кодексу України.\n",
    "Детальніше читайте на УНІАН: http://www.unian.ua/society/1274351-pislya-pogromiv-u-rosiyskih-bankah-na-dopit-viklikayut-kombata-oun.html\n",
    "\"\"\"\n",
    "\n",
    "def ppp(lst):\n",
    "    \"\"\" супер функція для друку результатів \"\"\"    \n",
    "    for li in lst:\n",
    "        print(li)\n",
    "\n",
    "# find names\n",
    "match = re.findall(u'(?u)[А-Я]\\w*\\s+[А-Я]\\w*', news)\n",
    "ppp(match)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ст. 296\n"
     ]
    }
   ],
   "source": [
    "# find criminal articles\n",
    "match = re.findall(ur'(?u)ст\\. \\d{1,5}', news)\n",
    "ppp(match)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "24.02.2016\n"
     ]
    }
   ],
   "source": [
    "# find date\n",
    "match = re.findall(ur'(?u)\\d{1,2}\\.\\d{1,2}.\\d{2,4}', news)\n",
    "ppp(match)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\"ОУН\"\n",
      "\"ОУН\"\n",
      "\"Альфа-банку\"\n",
      "\"Сбербанку Росії\"\n"
     ]
    }
   ],
   "source": [
    "#best trick in regex: Not_this_context|(WeWantThis)\n",
    "#match = re.findall(u'(?u)комбата|комбату|(комбат)', news)\n",
    "#match = re.findall(u'(?u)(?<=\").+?(?=\")', news) # positive loockahead and lookbehind\n",
    "\n",
    "# все, що в лапках. зазвичай, це цікаві назви\n",
    "match = re.findall(u'(?u)\".+?\"', news)\n",
    "ppp(match)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "RegExи зустрічаються всюди - навіть у екселі (Find & Replace). Класний приклад аналізу: [Електронна пошта Гіларі](https://github.com/datahoarder/secretary-clinton-email-dump/blob/master/README.md)\n",
    " "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# знайти всі долари, що згадуються у переписці\n",
    "!ag '\\$\\d+' ./clinton"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     14 http://www.messagelabs.com/email\r\n",
      "      6 http://www.nio.gov.uk/the-agreement\r\n",
      "      6 http://www.guardian.co.uk/uk/northernireland\r\n",
      "      6 http://www.guardian.co.uk/profile/henrymcdonald\r\n",
      "      6 http://www.guardian.co.uk/politics/sinn-fein\r\n",
      "      6 http://www.guardian.co.uk/politics/dup\r\n",
      "      6 http://www.guardian.co.uk/politics/2010/feb/05/northern-ireland-dup-ulsterdeal\r\n",
      "      6 http://www.guardian.co.uk/help/accessibility\r\n",
      "      6 http://static.guim.co.uk/sysimages/Guardian/Pix/pictures/2010/2/5/1265368562294/Gordon-Brown-Peter-Robins-001.jpg\r\n",
      "      5 http://www.huffingtonpost.com/\r\n",
      "      4 http://www.youtube.com/nicholaskristof\r\n",
      "      4 http://www.tomdispatch.com/blog/175334/\r\n",
      "      4 http://www.sipri.org/research/armaments/milex/resultoutput/trends\r\n",
      "      4 http://www.sipri.org/research/armaments/milex/resultoutput/trendgraphs/Top1Obubble/top1Obubble2009/image_vi\r\n",
{'fraction_non_alphanumeric': 0.20078604426670343, 'fraction_numerical': 0.01703095911190788, 'mean_word_length': 2.3558537714021286, 'pattern_counts': {'":': 140, '<': 11, '<?xml version=': 0, '>': 9, 'https://': 2, 'lorem ipsum': 0, 'www.': 28, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6166529', 'n_tokens_mistral': 6391, 'n_tokens_neox': 6851, 'n_words': 1120}