ویکی‌پدیا:درخواست‌های ربات/تمیزکاری عنوان‌ها

به جای [[{{}}]] نام ربات خودتان را بنویسید

#!/usr/bin/python
# -*- coding: utf-8  -*-
# Reza(User:reza1615), 2013
#
# Distributed under the terms of MIT License (MIT)
version=u'8.0'
import re,codecs,os
import pywikibot
from pywikibot.compat import query
import string
from datetime import timedelta,datetime
faSite = pywikibot.Site('fa')
bot_adress=u'/data/project/YourBot/'

#-----------------
tags = ur'b|big|blockquote|charinsert|code|comment|del|div|em|gallery|hyperlink|i|includeonly|imagemap|inputbox|link|math|noinclude|nowiki|pre|ref|s|small|source|startspace|strong|sub|sup|template|timeline'
faChrs = u'ءاآأإئؤبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهیيك'
langs = u'بلغاری|بنگالی|پارسی باستان|پارسی میانه|پالی|پرتغالی|پشتو|پنجابی|پین‌یینی|تاگالوگ|تامیلی|تاهیتی|تایلندی|ترکمنی|ترکی|ترکی استانبولی|ترکی آذربایجانی|تلگو|جاوه‌ای|چکی|چینی|چینی ساده‌شده|چینی سنتی|دانمارکی|دوناگری|روسی|رومانیایی|ژاپنی|سامی|سانسکریت|سریانی|سکایی|سواحلی|سواحیلی|سوندایی|سوئدی|سیسیلی|صربی|عبری|عربی|فارسی افغانستان|فارسی ایران|فارسی تاجیکی|فارسی سره|فرانسوی|فنلاندی|فیلیپینی|کاتالان|کردی|کره‌ای|کروات|کرواسی|گالیسی|گجراتی|گرجی|گرینلندی|لاتین|لتونیایی|لیتوانیایی|مازندرانی|مالایی|مالزیایی|مجاری|مراتی|مصری|مغولی|مقدونی|نپالی|نروژی|نروژی نو|نورمنی|هاوائی|هائیتیایی|هلندی|هندی|هواسایی|ولزی|ویتنامی|یونانی|یونانی باستان'
zaed = ur"''متن مورب''|'''متن ضخیم'''|\[\[پرونده:مثال\.jpg]]|=+ متن عنوان =+|:خط تو رفته\n?|<nowiki>اینجا متن قالب‌بندی‌نشده وارد شود</nowiki>|\# مورد فهرست شماره‌ای\n?|\* مورد فهرست گلوله‌ای|<sub>متن زیرنویس</sub>|<sup>متن بالانویس</sup>|<small>متن کوچک</small>|<big>متن بزرگ</big>|#(؟:تغییرمسیر|REDIRECT) \[\[(?:نام صفحه مقصد|نام صفحه)]]|\{\| class=\.wikitable\.\n\|-\n! متن عنوان !! متن عنوان !! متن عنوان\n\|-\n\| مثال \|\| مثال \|\| مثال\n\|-\n\| مثال \|\| مثال \|\| مثال\n\|-\n\| مثال \|\| مثال \|\| مثال\n\|}|<gallery>\nپرونده:مثال\.jpg\|عنوان ۱\nپرونده:مثال.jpg\|عنوان ۲\n</gallery>|<ref>{{یادکرد\|نویسنده = \|عنوان = \| ناشر = \|صفحه = \|تاریخ = }}</ref>|<ref>{{یادکرد وب\|نویسنده = \|نشانی = \|عنوان = \| ناشر = \|تاریخ = \|تاریخ بازدید = }}</ref>|<ref>{{یادکرد خبر\|نام = \|نام خانوادگی = \|همکاران = \|پیوند = \|عنوان = \|اثر = \| ناشر = \|صفحه = \|تاریخ = \|بازیابی = }}</ref>|\[\[رده:]]|\[\[en:]]|\[\[fa:.*?]]|\[\[عنوان پیوند]]|\{\{\s*}}|\[\[\s*\|?\s*]]|<!-- *?-->|\'\'\'متن ضخیم'\'\'\|'\'متن مورب\'\'|\'\'\'متن پررنگ\'\'\'"#-----------------
bnMazi = u'[آا]راست|[آا]را?مید|[آا]زرد|[آا]زمود|[آا]سود|[آا]شامید|[آا]شفت|[آا]فرید|[آا]لا[یئ]ید|[آا]لود|[آا]ما[هس]ید|[آا]مد|[آا]مرزید|[آا]م[یو]خت|آورد|[آا][هو]یخت|[آا]غ[شس]ت|ارزید|افتاد|افراشت|ا?فروخت|افزود|افسرد|ا?فشاند|اف[کگ]ند|انجامید|اند[او]خت|اندیشید|ان[بگ]اشت|نگاشت|انگیخت|ایستاد|با[خف]ت|با[لر]ید|[شب]ایست|بخش[یو]د|برازید|ب[ور]د|[چبپ]رید|[رجشب]ست|بلعید|پ[وا]شید|پخت|پذیرفت|پرا[کگ]ند|پرداخت|پرست?ید|پرورد|پرید|پژمرد|پژوهید|پسندید|پنداشت|[بپ]و[سشی]ید|پیچید|پیراست|پیمود|پیوست|تا[فخ]ت|تپید|ترا[وش]ید|تر[سشک]ید|تکانی?د|تنید|توانست|جن[بگ]ید|[جد]وش?ید|چرخید|چسبید|چ[مکشر]?ید|خر[او]شید|خ[مرز]ید|خشکید|خوابید|خو?است|خواند|خورد|خیسید|داد|داشت|[مد]انست|درخشید|دزدید|دوخت|ربود|راند|ر[مس]ید|رو?فت|رنجید|رو[یئ]ید|ریخت|زد|زدود|زیست|س[وا]خت|سپرد|س[تر]ود|ستیزید|سرشت|سزید|سنجید|ش[تکگ]افت|شد|شک?ست|ش[کگ]فت|شمرد|شناخت|شنید|شورید|طلبید|غلطید|فرستاد|فر[مس]ود|فریفت|فشرد|فهمید|قبولاند|کا[سش]ت|کاوید|ک[نر]د|کشت|کشید|کو[چش]ید|کوفت|گداخت|گذا?شت|گرا[یئ]ید|گردید|گرفت|گروید|گری[خس]ت|گزارد|گزید|گس[تا]رد|گسست|گ[فش]ت|گشود|گماشت|گنجید|ل[رغ]زید|ما[لس]ید|ماند|مرد|نا[مل]ید|نشست|نکوهید|نگاشت|ن?گریست|نمود|نواخت|نوردید|نوشت|نهاد|نهفت|نی?وشید|ور?زید|هراسید|هلید|یازید|یافت'
bnMzare = u'[آا]را[یم]|[آا]زار|[آا]ماس|[آا]ز?مای|[آا]سای|[آا]شام|[آا]شوب|[آا]غا[رز]|[آا]فرین|[آا]گن|[آا]لای|[آا]ی|[آا]م[یور]ز|[آا]و?ر|[آا]ویز|[آا]هنج|ارز|افت|افر[او]ز|افزای|افسر|ا?فشان|اف[کگ]ن|انبار|انجام|اندا[یز]|اندوز|اندیش|ا?نگار|انگیز|اوبار|ایست|با[فلیشرز]|بخشای|بخش|براز|ب[َُ]?ر|بند|بساو|بسیج|بلع|بو[یس]?|بیز|پاش|پالای|پ[رز]|پذیر|پرا[کگ]ن|پرداز|پرست?|پرور|پژمر|پژوه|پسند|پلاس|پلک|پناه|پندار|پو[سشیک]|پیچ|پی[مر]ای|پیوند|تا[پز]|تو?پ|ترا[شو]|تر[سشک]|تکان|تن|توان|[نلجد]ه|جن[بگ]|جو[یش]?|چا[یپ]|چ[مکپشفر]|چر[خب]?|چسب?|چلان|چین|خا[یر]|خرا[مش]|خس[بت]|خشک|خروش|خ[ملرز]|خوا[نبه]|خو[فر]|خی[سز]|دا[نر]|درخش|درو?|دزد|[لد]م|دو[شز]?|ربای|ران|رخش|ر[سمه]|رو[یب]?|رشت|رقص|رنج|[بر]ی[نز]|زا[یر]|ز[ین]|زدای|ساز|سپا?ر|سپ؟وز|ستان|ستر|ستیز|سرای|سرشت|س[رز]|سنب|سگال|سنج|سای|شا[شی]|شتاب|شوی?|شک[او]ف|شکن|شکیب|ش[مو]ر|شناس|شنو|طلب|طوف|غارت|غرّ?|غلط|غنو|فرست|فر[سم]ای|فروش|فریب|فشر|فهم|قاپ|قبولان|کا[هرو]|ک[َُِ]?ش|ک[نف]|کو[چشب]|گای|گداز|گذا?ر|گرا[یز]|گرد|گیر|گرو|گریز?|گزار|گز|گزین|گس[تا]ر|گسی?ل|گشای|گو[یز]|گن[جد]|گ[مو]ار|ل[غر]ز|لن[گد]|لیس|ما[سلن]|میر|مک|مو[یل]|نا[زلم]|ن?شین|نکوه|نگا?ر|نمای|نواز|نورد|نویس|نهنب|نی?وش|ور?ز|هراس|هل|یا[برز]'
noAlef = u'باجی|بادانی?|بادی?|بار|باژور|بافت|با[لن]|بانگا[نه]|بتاب|بجی?|بچین|بخس[بت]|بخواره|بخور[دشی]?|بخوست|بخیز|بدارچی|بدارخانه|بدار[وکی]?|بدستان|بدستی?|بدندان|بدنگ|بده|بدیده|براهه?|برفت|برو[دن]|بریز|بریزگان|بزن|بز[یه]|بژ|بسال|بسالان|بست|بستره|بست[نه]|بسکون|بسه|بسوار|بشار|بشتگاه|بشتن?|بشخور|بش[نیش]|بشنگ|بغوره|بفت|بک|بکار|ب‌?کافت|بکا[نم]ه|بکش|بکشین|بکند|بکوهه|بکی|بگاه|بگرد|بگردان|بگز|بگوشت|بگون|بگیر|بگینه|بلوج|بنوس|بوند|بونمان|بونه|بیار|پارات|پارتاید|پارتمان|پاراتی|پاندیس|پاندیسیت|تربان|ترمه|تروپین|تریاد|تشبار|تشبان|تشپا|تشخوار|تشدان|تشفشان|تشک|تشکده|تشگاه|تش[هی]?|تشیزه|تشین|تلیه|ته|تورپات|تیه|ثار|ثام|جاردن|جان|جودان|جید[نه]|جیل|جین|چار|چاردن|چارکشی|چمز|حاد|خال|خت[نه]|خر|خرالامر|خرالزمان|خرت|خردست|خرزمان|خریا؟ن|خ[سش]مه|خشیج|خشیجان|خشیگ|خور|خورچرب|خورخشک|خورسنگین|خوندبازی|خوندک?|دا[بشک]|دامس|دخ|درس|درمه?|درنگ|دمک|دمیت|دمیرال|دمیزاد|دنیس|دیش|دیند?ه|ذار|ذری?|ذربایجانی?|ذربو|ذرجشن|ذرخش|ذریو?ن|ذوقه|ذین|را[یء]|راستن|راسته|رام|رامانیدن|رامش|رامگاه|رامی|رامیدن|رایش|رایشگاه|رایشگر|راییدن|رتروز|رتزین|رتیست|رتیشو|رخالق|ردبیز|رده|ردینه|رزم|رزو|رزوخواه|رزومندی?|رشه|رشیتکت|رشیو|رغ|رغده|رگون|رمان|رمان‌?شهر|رمیچر|رمید[هن]|رن|رنائوت|رنج|رنگ|رواره|روبند|روغ|ری|ریا|ریستوکرات|ریستوکراسی|ریغ|زادگان|زادگی|زادمرد|زاد[یه]?|زادوار|زادی‌?خواه|زار|زارتلخه|زا?رد[نه]|زارنده|زاریدن|زال|زجوی|زخ|زدن|زرد|زردگی|زرم|زرمجو|زرمگین|زری|زغ|زفنداک|زگار|زما|زمایش|زمایشگاه|زماینده|زمایه|زمندی?|زمودگی|زمود[نه]|زمون|زناک|زور|زوغ|زوقه|زیدن|زیر|ژان|ژانس|ژخ|ژدار|ژده|ژغ|ژفنداک|ژگن|ژن[دگ]|ژندن|ژندیدن|ژیانه|ژید[نه]|ژیر|ژیرنده|ژیریدن|ژینه|سان|سانسور|سانی|سایش|سایشگاه|ساینده|ساییدن|سبان|سپیرین|ستانه|ستر|ستیگماتیسم|ستی[من]ه?|سدست|سغده|سفالت|سکاریس|سمانخانه|سمانخراش|سمان[هی]?|سموغ|سه|سودگی|سود[نه]|سیابان|سیاچرخ|سیازنه|سیاکردن|سیا[وب]?|سیایی|سیب|سیل|سی[من]ه|سیون|شا[بم]|شامیدن|شانه|شپز|شپزخانه|شتالنگ|شت[می]|شخال|شخانه|شردن|شرمه|شفتگی|شفت[نه]?|شکار|شکارساز|شکاره|شکوبه|شکو[بخ]?|شکوخیدن|شگر|شمالی?|شموغ|شنا|شناگر|شنا[هو]|شناوری|شنایی|شوب|شوب‌?گر|شوبیدن?|شور|شوردن|شوریده|شوغ|شوفتن|شیانه|شیهه|صال|غُش|غا|غاجی|غار|غاردن|غاری|غاریدن|غازگر|غاز[هی]?|غازیدن|غالش?|غالنده|غالید[نه]|غچه|غردن|غری?|غز|غ[سش]ت[نه]|غل|غندن|غنده|غو[زشل]|غوشیدن|غیل|فا[تق]|فاقی|فتاب[هی]?|فتومات|فدم|فرنگ|فروشه|فریدگار|فرید[نه]|فرین|فرینگان|فریننده|فگانه|فل|فند|فندیدن|فیش|ق|قا|قازاده|قاسی|ق‌?بانو|قچه|قسنقر|قشام|قطی|قورایی|قوش|کادمیک?|کاردئون|کام|ک[بپج]|کبند|کتریس|کتور|کروبات|کروباسی|کستن|ککرا|کله|کند[نه]|کنش|کنه|کنیدن|کواریوم|کوستیک|کولاد|کومولاتور|گاهاندن|گاهی?|گ[پج]|گراندیسمان|گرمان|گشتن|گفت|گنج|گنده|گهی|گو|گور|گورگر|گو[شن]|گیشیدن|گی[من]|لاپلنگی|لات|لاچیق|لاخون|لاس|لاسکا|لاگارسون|لامد?|لاوه?|لایش|لاییدن|لبالو|لبوم|لبومین|لپر|لت|لترناتیو|لر|لرژی|ل[شغ]|لغده|لفا|لفت[نه]|لکالویید|لگرو|لگونه|لوچه|لودگی|لود[نه]|لوسن|لومین|لومینیوم|لو[ئن]ک|لیاژ|لیداد|لیزیدن|ماتور|ماج|ماجگاه|مادگی|ماده|مار|مارگر|ماریدن|ماریلیس|ماس|ماسانیدن|ماسیدن|ماق|مال|مانی|ماهانیدن|ماهیدن|مبولانس|مپر|مپرسنج|مپلی|مپول|مپی|مخته|مدگان|مدن?|مرانه|مرزش|مرزگار|مرزنده|مرزیدن|مرزیده|مرغ|مریکا|مریکایی?|مفی|مفیبول|مه|موت|موخت[نه]|مود[نه]|موزانه|موزشی?|موزشیار|موزگا[رن]|موزنده|موزه|موق|موکسی|مولن|مون|مونیاک|میب|میختگی|میخت[نه]|میز[شه]?|میزگاری?|میغه?|نابولیسم|نات?|ناتومی|نارشی|نارشیس[تم]ی?|ناس|نالوگ|نالیز|نام|ناناس|نتراکت|نتریک|نت[نی]|نتیک|نجا|نچت?|ندوتوکسین|ندودرم|ندوسپرم|ندوسکوپی|ندون|نرمال|نزیم|نژین|نژیوکت|نژیوگرافی|نسه|نسیلین|نک|نگلوفیل|نوریسم|نیلین|نین|نیه|نیون|هار|هاردن|هازیدن|هستگی|هسته|هک|همند|هنج|هنجیدن|هنگ[ری]?|هنگساز|هنین|هو|هوانگیز|هوپا|هوتک|هوچشم|هودل|هوفغند|هومند|هون|هیانه|هیختن|واخ|وارگی|وا[رز]ه?|واشناسی|واکس|وام|وانتاژ|وانس|وانگارد|وانویسی|وردجو|وردگا؟ه|وردن|وردیدن|ورک|ورنجن|وری|وریدن|وریل|ونگ|ونگان|ونگون|ویخت[نه]|ویزش?|ویزگ?ان|وی[زژ]ه|ویزون|ویشن|یا[تن]?|یبک|یتم?|یزنه|یژ|یفت|یفون|ینده|یه|ییژ|یین|[یئ]?ینه|ئورت'

sametH = ur'فرمانده|زره|کوه|گره|گنه|سپه|مکروه|م?ت?وجّ?ه|منزّ?ه|نزه|ابله|مرفّ?ه|شبیه|مت?شابه|کریه|پادشه|اللّ?ه|اله|[آکبتدرزشلم]ه' #e: صامت هـ
spcBfre = u'.،,:؛;؟٫)}]»》”,·。一ー・、:()「」〜?!ء'
spcAftr = u'({[«《“,·。一ー٫・、:()「」〜?!'
bLA = u'(?!['+faChrs+u'])'
bLB = u'(?<!['+faChrs+u'])'
arabicDigits = ur'0123456789'
arabicIndicDigits = ur'٠١٢٣٤٥٦٧٨٩'

similarPersianCharacters = ur'\u0643\uFB91\uFB90\uFB8F\uFB8E\uFEDC\uFEDB\uFEDA\uFED9\u0649\uFEEF\u064A\u06C1\u06D5\u06BE\uFEF0-\uFEF4'
vowels = ur'\u064B-\u0650\u0652\u0670'
persianCharacters = ur'\u0621-\u0655\u067E\u0686\u0698\u06AF\u06A9\u0643\u06AA\uFED9\uFEDA\u06CC\uFEF1\uFEF2' + similarPersianCharacters
persianCharactersNoVowels = ur'\u0621-\u064A\u0653-\u0655\u067E\u0686\u0698\u06AF\u06A9\u0643\u06AA\uFED9\uFEDA\u06CC\uFEF1\uFEF2' + similarPersianCharacters
persianDigits = ur'۰۱۲۳۴۵۶۷۸۹'
hamza = ur'\u0654'
NASB = u'\u064b'
ZAMM = u'\u064c'
persianPastVerbs = ur'(' \
    + ur'ارزید|افتاد|افراشت|افروخت|افزود|افسرد|افشاند|افکند|انباشت|انجامید|انداخت|اندوخت|اندود|اندیشید|انگاشت|انگیخت|انگیزاند|اوباشت|ایستاد' \
    + ur'|آراست|آراماند|آرامید|آرمید|آزرد|آزمود|آسود|آشامید|آشفت|آشوبید|آغازید|آغشت|آفرید|آکند|آگند|آلود|آمد|آمرزید|آموخت|آموزاند' \
    + ur'|آمیخت|آهیخت|آورد|آویخت|باخت|باراند|بارید|بافت|بالید|باوراند|بایست|بخشود|بخشید|برازید|برد|برید|بست|بسود|بسیجید|بلعید' \
    + ur'|بود|بوسید|بویید|بیخت|پاشاند|پاشید|پالود|پایید|پخت|پذیراند|پذیرفت|پراکند|پراند|پرداخت|پرستید|پرسید|پرهیزید|پروراند|پرورد|پرید' \
    + ur'|پژمرد|پژوهید|پسندید|پلاسید|پلکید|پناهید|پنداشت|پوسید|پوشاند|پوشید|پویید|پیچاند|پیچانید|پیچید|پیراست|پیمود|پیوست|تاباند|تابید|تاخت' \
    + ur'|تاراند|تازاند|تازید|تافت|تپاند|تپید|تراشاند|تراشید|تراوید|ترساند|ترسید|ترشید|ترکاند|ترکید|تکاند|تکانید|تنید|توانست|جَست|جُست' \
    + ur'|جست|جنباند|جنبید|جنگید|جهاند|جهید|جوشاند|جوشید|جوید|چاپید|چایید|چپاند|چپید|چراند|چربید|چرخاند|چرخید|چرید|چسباند|چسبید' \
    + ur'|چشاند|چشید|چکاند|چکید|چلاند|چلانید|چمید|چید|خاراند|خارید|خاست|خایید|خراشاند|خراشید|خرامید|خروشید|خرید|خزید|خست|خشکاند' \
    + ur'|خشکید|خفت|خلید|خمید|خنداند|خندانید|خندید|خواباند|خوابانید|خوابید|خواست|خواند|خوراند|خورد|خوفید|خیساند|خیسید|داد|داشت|دانست' \
    + ur'|درخشانید|درخشید|دروید|درید|دزدید|دمید|دواند|دوخت|دوشید|دوید|دید|دیدم|راند|ربود|رخشید|رساند|رسانید|رست|رَست|رُست' \
    + ur'|رسید|رشت|رفت|رُفت|رقصاند|رقصید|رمید|رنجاند|رنجید|رندید|رهاند|رهانید|رهید|روبید|روفت|رویاند|رویید|ریخت|رید|ریسید' \
    + ur'|زاد|زارید|زایید|زد|زدود|زیست|سابید|ساخت|سپارد|سپرد|سپوخت|ستاند|ستد|سترد|ستود|ستیزید|سرایید|سرشت|سرود|سرید' \
    + ur'|سزید|سفت|سگالید|سنجید|سوخت|سود|سوزاند|شاشید|شایست|شتافت|شد|شست|شکافت|شکست|شکفت|شکیفت|شگفت|شمارد|شمرد|شناخت' \
    + ur'|شناساند|شنید|شوراند|شورید|طپید|طلبید|طوفید|غارتید|غرید|غلتاند|غلتانید|غلتید|غلطاند|غلطانید|غلطید|غنود|فرستاد|فرسود|فرمود|فروخت' \
    + ur'|فریفت|فشاند|فشرد|فهماند|فهمید|قاپید|قبولاند|کاست|کاشت|کاوید|کرد|کشاند|کشانید|کشت|کشید|کفت|کفید|کند|کوبید|کوچید' \
    + ur'|کوشید|کوفت|گَزید|گُزید|گایید|گداخت|گذارد|گذاشت|گذراند|گذشت|گرازید|گرایید|گرداند|گردانید|گردید|گرفت|گروید|گریاند|گریخت|گریست' \
    + ur'|گزارد|گزید|گسارد|گستراند|گسترد|گسست|گسیخت|گشت|گشود|گفت|گمارد|گماشت|گنجاند|گنجانید|گنجید|گندید|گوارید|گوزید|لرزاند|لرزید' \
    + ur'|لغزاند|لغزید|لمباند|لمدنی|لمید|لندید|لنگید|لهید|لولید|لیسید|ماسید|مالاند|مالید|ماند|مانست|مرد|مکشید|مکید|مولید|مویید' \
    + ur'|نازید|نالید|نامید|نشاند|نشست|نکوهید|نگاشت|نگریست|نمایاند|نمود|نهاد|نهفت|نواخت|نوردید|نوشاند|نوشت|نوشید|نیوشید|هراسید|هشت' \
    + ur'|ورزید|وزاند|وزید|یارست|یازید|یافت' + ur')'

persianPresentVerbs = ur'(' \
    + ur'ارز|افت|افراز|افروز|افزا|افزای|افسر|افشان|افکن|انبار|انباز|انجام|انداز|اندای|اندوز|اندیش|انگار|انگیز|انگیزان' \
    + ur'|اوبار|ایست|آرا|آرام|آرامان|آرای|آزار|آزما|آزمای|آسا|آسای|آشام|آشوب|آغار|آغاز|آفرین|آکن|آگن|آلا|آلای' \
    + ur'|آمرز|آموز|آموزان|آمیز|آهنج|آور|آویز|آی|بار|باران|باز|باش|باف|بال|باوران|بای|باید|بخش|بخشا|بخشای' \
    + ur'|بر|بَر|بُر|براز|بساو|بسیج|بلع|بند|بو|بوس|بوی|بیز|بین|پا|پاش|پاشان|پالا|پالای|پذیر|پذیران' \
    + ur'|پر|پراکن|پران|پرداز|پرس|پرست|پرهیز|پرور|پروران|پز|پژمر|پژوه|پسند|پلاس|پلک|پناه|پندار|پوس|پوش|پوشان' \
    + ur'|پوی|پیچ|پیچان|پیرا|پیرای|پیما|پیمای|پیوند|تاب|تابان|تاران|تاز|تازان|تپ|تپان|تراش|تراشان|تراو|ترس|ترسان' \
    + ur'|ترش|ترک|ترکان|تکان|تن|توان|توپ|جنب|جنبان|جنگ|جه|جهان|جو|جوش|جوشان|جوی|چاپ|چای|چپ|چپان' \
    + ur'|چر|چران|چرب|چرخ|چرخان|چسب|چسبان|چش|چشان|چک|چکان|چل|چلان|چم|چین|خار|خاران|خای|خر|خراش' \
    + ur'|خراشان|خرام|خروش|خز|خست|خشک|خشکان|خل|خم|خند|خندان|خواب|خوابان|خوان|خواه|خور|خوران|خوف|خیز|خیس' \
    + ur'|خیسان|دار|درخش|درخشان|درو|دزد|دم|ده|دو|دوان|دوز|دوش|ران|ربا|ربای|رخش|رس|رسان' \
    + ur'|رشت|رقص|رقصان|رم|رنج|رنجان|رند|ره|رهان|رو|روب|روی|رویان|ریز|ریس|رین|زا|زار|زای|زدا' \
    + ur'|زدای|زن|زی|ساب|ساز|سای|سپار|سپر|سپوز|ستا|ستان|ستر|ستیز|سر|سرا|سرای|سرشت|سز|سگال|سنب' \
    + ur'|سنج|سوز|سوزان|شاش|شای|شتاب|شکاف|شکف|شکن|شکوف|شکیب|شمار|شمر|شناس|شناسان|شنو|شو|شور|شوران|شوی' \
    + ur'|طپ|طلب|طوف|غارت|غر|غلت|غلتان|غلط|غلطان|غنو|فرسا|فرسای|فرست|فرما|فرمای|فروش|فریب|فشار|فشان|فشر' \
    + ur'|فهم|فهمان|قاپ|قبولان|کار|کاه|کاو|کش|کَش|کُش|کِش|کشان|کف|کن|کوب|کوچ|کوش|گا|گای|گداز' \
    + ur'|گذار|گذر|گذران|گرا|گراز|گرای|گرد|گردان|گرو|گری|گریان|گریز|گز|گزار|گزین|گسار|گستر|گستران|گسل|گشا' \
    + ur'|گشای|گمار|گنج|گنجان|گند|گو|گوار|گوز|گوی|گیر|لرز|لرزان|لغز|لغزان|لم|لمبان|لند|لنگ|له|لول' \
    + ur'|لیس|ماس|مال|مان|مک|مول|موی|میر|ناز|نال|نام|نشان|نشین|نکوه|نگار|نگر|نما|نمای|نمایان|نه' \
    + ur'|نهنب|نواز|نورد|نوش|نوشان|نویس|نیوش|هراس|هست|هل|ورز|وز|وزان|یاب|یار|یاز' \
    + ur')'

persianComplexPastVerbs = {  # bug: در گذشته
    ur'باز': u'آفرید|آمد|آموخت|آورد|ایستاد|تابید|جست|خواند|داشت|رساند|ستاند|شمرد|ماند|نمایاند|نهاد|نگریست|پرسید|گذارد' \
            + ur'|گرداند|گردید|گرفت|گشت|گشود|گفت|یافت',
    ur'در': u'بر ?داشت|بر ?گرفت|آمد|آمیخت|آورد|آویخت|افتاد|افکند|انداخت|رفت|ماند|نوردید|کشید|گرفت',
    ur'بر': u'آشفت|آمد|آورد|افتاد|افراشت|افروخت|افشاند|افکند|انداخت|انگیخت|تاباند|تابید|تافت|تنید|جهید|خاست|خواست|خورد' \
           + ur'|داشت|دمید|شمرد|نهاد|چید|کرد|کشید|گرداند|گردانید|گردید|گزید|گشت|گشود|گمارد|گماشت',
    ur'فرو': u'آمد|خورد|داد|رفت|نشاند|کرد|گذارد|گذاشت',
    ur'وا': u'داشت|رهاند|ماند|نهاد|کرد',
    ur'ور': u'آمد|افتاد|رفت',
    ur'یاد': u'گرفت',
    ur'پدید': u'آورد',
    ur'پراکنده': u'ساخت',
    ur'زمین': u'خورد',
    ur'گول': u'زد',
    ur'لخت': u'کرد',
}

persianComplexPresentVerbs = {  # مشکل با: در روم باستان، در ده
    # مشکل با : بر گردن
    ur'باز': u'آفرین|آموز|آور|ایست|تاب|جو|خوان|دار|رس|ستان|شمار|مان|نمایان|نه|نگر|پرس|گذار|گردان|گرد|گشا|گو|گیر|یاب',
    ur'در': u'بر ?دار|بر ?گیر|آمیز|آور|آویز|افت|افکن|انداز|مان|نورد|کش|گذر|گیر',
    ur'بر': u'آشوب|آور|افت|افراز|افروز|افشان|افکن|انداز|انگیز|تابان|تاب|تن|جه|خواه|خور|خیز|دار|دم|شمار|نه|چین|کش|کن' \
           + ur'|گردان|گزین|گشا|گمار',
    ur'فرو': u'خور|ده|رو|نشین|کن|گذار',
    ur'وا': u'دار|رهان|مان|نه|کن',
    ur'ور': u'افت|رو',
    ur'یاد': u'گیر',
    ur'پدید': u'آور',
    ur'پراکنده': u'ساز',
    ur'زمین': u'خور',
    ur'گول': u'زن',
    ur'لخت': u'کن',
}

adjective = \
    ur'اخمو|ارزان|ارغه|الکن|الکی|انبوه|آبدار|(نا)?آرام|آرغنده|(نا)?آشکار|(نا)?آماده|آهسته|(بی\u200c|با)انضباط|باریک|بد|بدحساب|بددل|بدریخت' \
    + ur'|بر|براق|برخوردار|برومند|بزدل|بلند|بی‌آلایش|بی دست و پا|بیچاره|بیدار|بیمار|پخ|پخش|پخمه|پرت|پرنور|پست|پشمالو|پلید|پوچ|(سر|نا)?پوشیده|پوک' \
    + ur'|پیر|پیروز|تار|تپل|ترد|ترسو|تفت|تلخ|تنبل|تندرو|تنک|تنگ|تنها|تهی|تیره|جلو|چابک|چاپلوس|چالاک|چپ|چرند|چسبان|چفته|چیره|خام|خانم|خراب' \
    + ur'|خرم|خسته|خشک|(نا)?خفته|خفن|خل|خنگ|(نا)?خوانا|خوب|خوشکل|خوش‌گوار|خیراندیش|دراز|درخور|درستکار|دلباخته|دلیر|دوست|دون|رحیم|رسمی|روانی|روشن' \
    + ur'|ریغو|زبر|زبردست|زبل|زشت|زیبا|زیرک|ژرف|ژنده|ساده|(نا)?سالم|ساکت|سبک|سخاوتمند|سر|سرکش|سفت|سوسول|شایسته|شکیبا|شل|شور|طولانی|عالم|فراوان|فرز' \
    + ur'|فنی|قرتی|قشنگ|قلنبه|قهرمان|کارکن|کال|کبود|کج|کچل|کر|کلان|کلفت|کم|کند|کنس|کوتاه|کوتوله|کوچک|کوچولو|کودن|گدا|گران|گرسنه|گشاد' \
    + ur'|گنگ|گود|گیج|لاغر|لبریز|لخت|لغزنده|له|مات|مچاله|مچل|(نا)?مرد|مردمی|مردنی|مست|مشکوک|مفید|ناپدید|ناپسند|ناتوان|ناجنس|ناجور|ناچیز|ناخوش' \
    + ur'|نادان|(نا)?درست|نازک|ناسپاس|نافرمان|ناگوار|نامرد|نرم|نیازمند|نیرومند|هشیار|هیز|واژگون|ول|ولرم|ولنگار|یکپارچه|یکدست|یکرنگ|(نا)?پیدا' \
    + ur'|گناهکار|ریز|دانا|کثیف|آقا|(با|بی\u200c)سواد|عاشق|(با|بی\u200c)محبت|صاف|زمخت|فریبنده|پیچیده|سخت|دشوار|تمیز|(نا)?پاکیزه|بزرگ|پهن|پخته|بی‌مورد' \
    + ur'|بی‌نیاز|(بی\u200c|با|)تجربه'

personNames = \
    ur'الله|محمد|علی|حسن|حسین|جواد|باقر|مهدی|تقی|نقی|نازی|نجم|' \
    + ur'اکرم|کاظم|عباس|منصور|خسرو|محمود|شمس|ملک|شوکت|' \
    + ur'نصر|همت|جهان|جلال|موسی|ابراهیم|جعفر|احمد|قاسم|کمال|هاشم|' \
    + ur'شفیع|صمد|شیخ|اسماعیل|ربیع|سلیمان|رستم|شاهرخ|فرخ|شریف|نعمت|' \
    + ur'امیر|خلیل|جلیل|مجید|اسد|شوکت|رضا|عجل|ید|عبد|سهیل|معصوم|عظیم' \
    + ur'اکبر|اصغر|بهمن|قلی'

wordsWithA = \
    ur'ورامدن|هرزاب|هراینه|هجوامیز|نوش‌اذر|نواوری|نواموز|نهراب|میراخور|میراب|می‌اید|می‌اورند|مرات' \
    + ur'|ماخذ|مابی|لس‌انجلس|گل‌اذین|گزنداور|گرداوری|گرداوردن|گرداورد|گردامدن|کنداور|کفرامیز|فرودامدن|عطراگین|طنزامیز' \
    + ur'|شیرابه|شهرا[یئ]ین|شهراشوب|سوداور|سراوردن|سرامدن|سرامد|سراشپز|سحرامیز|زیرابی|زوراور|زهرالود|زهراگین|زردالو|دوداهنگ|دواتشه' \
    + ur'|دژاهنگ|دژالود|درداور|دردالود|درایند|دراید|دراویختن|دراوری|دراورنده|دراورند|دراوردن|درامده|درامدن|درامد|خیزاب|خشم‌الود' \
    + ur'|چندش‌اور|جگراور|تیراهن|تهورامیز|تنفراور|تنداب|پسندامدن|پرنداور|پردرامد|پراشوب|پراب|بی‌اب|بوا|بنداوردن' \
    + ur'|بنداور|سرامدن|برایند|براورده|براوردن|براورد|برامده|برامدن|برامدگی|برامد|براشفته|براشفتن|براشفتگی|براسودن|بداهنگ' \
    + ur'|بداموزی|بدامدن|بدامد|ائورت|ائسه|ا[یئ]ینه|ا[یئ]ین‌نامه|ا[یئ]ین|ایه‌یاب|ایه|اینه‌دار|اینده|ایندگان|ایفون' \
    + ur'|ایروپلن|ایدین|ایتم|ایت‌الله|ایت|ایات|اویشن|اویسا|اویژه|اویزون|اویزه|اویزند|اویزگر|اویزش' \
    + ur'|اویزدار|اویزان|اویز|اویخته|اویختنی|اویختن|اویختگی|اویخت|اویتخه|اووکادو|اونگون|اونگان|اونگ|اوند|اوریل' \
    + ur'|اوریدن|اورنده|اورند|اورنجن|اوردیدن|اورده|اوردنی|اوردن|اوردگه|اوردگاه|اوردجو|اورد' \
    + ur'|اوایش|اوانویس|اوانگارد|اوانتاژ|اواکس|اواشناس|اوازه‌خوان|اوازهای|اوازه|اوازخوان|اواز|اواره|اوارگی|اوارگان' \
    + ur'|اوار|اهو|اهنین|اهنگ‌ساز|اهنگرخانه|اهنگر|اهنگ|اهن‌فروش|اهن‌ربا' \
    + ur'|اهن‌پاره|اهن‌بر|اهن‌الات|اهن|اهک‌سازی|اهک‌پزی|اهک‌پز|اهک|اهسته|اهستگی|اهای|اهان' \
    + ur'|انیون|انوقت|انود|انها|ان‌گه|ان‌گاه|ان‌که|ان‌کس|انکارا|ان‌قدر|انفولانزا|انفلوانزا' \
    + ur'|انفارکتوس|ان‌طور|ان‌طرف|ان‌سو|انژیوگرافی|انژین|انزیم|ان‌روی|ان‌روز|ان‌رو|اندوسکوپی|ان‌چه|ان‌جا|انتیل|انتیک' \
    + ur'|انتی|انتن|انتریک|انتراکت|انتراسیت|انتالیا|اناهیتا|اناناس|انان|انالیز|انالوگ|انارشیسم|اناتومی|اناتولی' \
    + ur'|انابولیسم|امینه|امیغه|امیغ|امیزه|امیزگار|امیزش|امیز|امیخته|امیختن|امیختگی|امیب|امونیوم|امونیت|امونیاک|امون' \
    + ur'|اموکسی|اموزه|اموزنده|اموزگان|اموزگار|اموزش‌یار|اموزشگاه|اموزشکده|اموزش|اموزانه|اموزاندن|اموز|اموده|امودن|امودریا' \
    + ur'|اموخته|اموختن|اموختگی|اموختار|امله|امریکا|امرزیده|امرزیدن|امرزیدگی|امرزنده|امرزگار|امرزش|امرز|امرانه' \
    + ur'|امدید|امدوشد|امدورفت|امده|امدن|امدگی|امدکردن|امد|امخته|امپلی|امپرسنج|امپر|امبولی|امبولانس|امایه|امایش|امال' \
    + ur'|اماسیده|اماسیدن|اماسانیدن|اماس|امازون|امارگیر|امارگر|امارشناسی|امارشناس|اماده‌کردن|اماده|امادگی|امادگاه' \
    + ur'|اماج‌گاه|اماج|اماتور|الیداد|الیاژهای|الیاژ|الونک|الومینیوم|الومینیم|الوزرد|الوده|الودن|الودگی|الودگر|الود|الوچه' \
    + ur'|الوبخارا|الما|الفرد|الفا|الرژی|التو|الترناتیو|الت|الپ|البومین|البوم|البانی|البالوئی|البالو|الا[یئ]یدن' \
    + ur'|الایشی|الایش|الای|الاسکا|الاخون|الاچیق|الات|الاباما|اگنه|اگنده|اگندن|اگاهی‌نامه|اگاهی‌دادن|اگاهی|اگاهگان' \
    + ur'|اگاهانیدن|اگاهانه|اگاهاندن|اگاه|اکوستیک|اکوردئون|اکواریوم|اکنه|اکنش|اکنده|اکندن|اکله|اکسفورد|اکروبات|اکتئون' \
    + ur'|اکتینیوم|اکانتاسه|اکادمیک|اکادمی|اق‌بانو|اقائی|اقایان|اقامنشانه|اقامنش|اقاسی|اقازاده|اقاجان|اقا' \
    + ur'|افریننده|افرینش|افرین|افریکانس|افریقا|افریده|افریدن|افریدگار|افتومات|افتابه|افتاب‌مهتاب|افتاب‌گیر' \
    + ur'|افتاب‌گردان|افتاب‌زده|افتاب‌زدگی|افتاب‌رو|افتاب‌خورده|افتاب‌پرست|افتاب|افاقی|افاق|افات|اغول|اغوشیدن|اغوش|اغل' \
    + ur'|اغشته|اغشتن|اغشتگی|اغش|اغالش|اغاسی|اغازین|اغازیدن|اغازیان|اغازی|اغازه|اغازگر|اغاز|اغاجی|اغا|اشیل|اشیانی|اشیانه' \
    + ur'|اشیان‌بندی|اشیان|اشور|اشوبیدن|اشوب‌ناک|اشوب‌گرانه|اشوب‌گر|اشوب‌کن|اشوب‌طلب|اشوب‌انگیز|اشوب|اشنایان|اشناوری' \
    + ur'|اشناگر|اشناسازی|اشنا|اشکوخیدن|اشکاره|اشکارگر|اشکارساز|اشکارا|اشکار|اشفته|اشفتن|اشفتگی|اشغالدان|اشتی' \
    + ur'|اشفتگی|اشپزخانه|اشپز|اشامیدنی|اشامیدن|اشامه|اشامنده|اشام|اشاب|اسیمه|اسیمگی|اسیب‌زدن' \
    + ur'|اسیب‌دیده|اسیب|اسیاکردن|اسیاسنگ|اسیازنه|اسیاچرخ|اسیابان|اسیاب|اسیا|اسوده‌خاطر|اسوده‌حال|اسوده|اسودن' \
    + ur'|اسودگی|اسمون|اسمانه|اسمان‌سنجی|اسمان‌خراش|اسمانخانه|اسمان|اسکاریس|اسفالت|استینه|استرکاری' \
    + ur'|استردوز|استانه|اسپیرین|اسپرین|اسائی|اسا[یئ]یدن|اساینده|اسایشگاه|اسایش|اسان‌گیری|اسانسورچی' \
    + ur'|اسانسور|اسان|اژیرهوائی|اژیر|اژیانه|اژنگ|اژند|اژفنداک|اژدار|اژانس|ازیدن|ازیتا|ازوقه|ازمون‌گر|ازمون‌گاه|ازمون|ازموده' \
    + ur'|ازمودن|ازمودگی|ازمندی|ازمند|ازمائی|ازمایه|ازماینده|ازمایشی|ازمایشو|ازمایشگاه|ازمایشات|ازمایش|ازمابنده|ازما|ازگار' \
    + ur'|ازرده|ازردن|ازردگی|ازرد|ازاریدن|ازارنده|ازاررسان|ازاردهنده|ازار|ازادی‌خواه|ازادوار' \
    + ur'|ازاده|ازادمنش|ازادمرد|ازادگی|ازادگان|ازادکامی|ازادانه|ازاد|اریانا|اریان|اریا|ار[و]غ' \
    + ur'|ارواره|ارنولد|ارنگ|ارنج|ارنائوت|ارمینا|ارمین|ارمیس|ارمیده|ارمیدن|ارمیدگی|ارمیچر|ارمه|ارمان‌شهر|ارماگدون|ارگون' \
    + ur'|ارکاد|ارشیو|ارشیتکت|ارشه|ارشام|ارش|ارستن|ارسان|ارژانتین|ارزومندانه|ارزومند|ارزوخواه|ارزو|ارتین|ارتیشو|ارتیست' \
    + ur'|ارتور|ارتمیس|ارتروز|ارا[یئ]یدن|ارایه‌گر|ارایشی|ارایشگر|ارایشگاه|ارایش|ارامیدن|ارامگاه|ارامگان|ارام‌کردن' \
    + ur'|ارامش|ارامانیدن|ارام|اراسته|اراستن|اراستگی|ارارات|اراء|اذین|اذرین|اذرنوش|اذرنگ|اذرگون|اذرشهر|اذرسنجی' \
    + ur'|اذرروز|اذرخش|اذربرزین|اذربایجان|اذر|ادینه|ادیس|ادونیس|ادنیس|ادمی‌گرا|ادمیزاد' \
    + ur'|ادمیرال|ادمیت|ادم‌گرا|ادم‌کش|ادمک|ادم‌فروش|ادم‌ربا|ادم‌خوار|ادرنالین|ادرس|ادامس|اداب|اخوندک|اخوند' \
    + ur'|اخور|اخرین|اخرسالار|اخرزمان|اخرت‌شناسی|اخرت|اخرالدواء|اخرالامر|اخر|اختن|احاد|اچمز|اچارکشی|اچاردار|اچار|اجیل|اجودان' \
    + ur'|اجرنما|اجرکاری|اجرچین|اجرپز|اجان|اثار|اتیه|اتیکا|اتیسا|اتلیه|اتشین|اتش‌ناک|اتش‌گیره|اتش‌گیر' \
    + ur'|اتش‌گون|اتش‌گرفتن|اتش‌گاه|اتشکده|اتش‌کار|اتش‌فشان|اتش‌زنه|اتش‌زدن|اتش‌زا|اتش‌دان|اتش‌خوار|اتش‌خانه|اتش‌پاره|اتش‌بان|اتش‌بازی|اتش‌بار' \
    + ur'|اتش|اتریوم|اتروپین|اتابای|اپولو|اپوستروف|اپاندیسیت|اپاندیس|اپارتمان|اپارتاید|اپارات|ابیار|ابونه|ابونمان' \
    + ur'|ابها|ابنوس|اب‌نمک|اب‌نما|اب‌[ن]شدنی|ابنبات|ابمیوه‌گیر|اب‌میوه|اب‌لیمو|ابله‌کوب|ابله‌رو|ابگینه|ابگیر|ابگونه|ابگون‌ساز' \
    + ur'|اب‌گوشت|اب‌گرمکن|اب‌گردان|اب‌گذر|اب‌گاه|اب‌کش|اب‌کانه|اب‌کامه|اب‌کار|اب‌فشان|ابغوره|ابشی|ابشور|اب‌شنگولی|ابشش|اب‌شدنی' \
    + ur'|ابش‌خور|ابشتگاه|ابشار|ابسوار|ابسه|ابسکون|ابستن|ابسالان|اب‌سال|ابزی‌گاه|ابزی‌دان|ابزی|ابریزگاه|ابریزگان|ابریزش' \
    + ur'|ابریز|ابرومند|ابروریزی|ابرنگ|ابرفت|ابراهه|ابراهک|ابراه|ابدیده|ابدزدک|ابدانک|ابدان|ابداری|ابدارخانه|ابدارچی' \
    + ur'|ابدارباشی|ابدار|اب‌خیز|ابخوری|ابجی|ابجوفروشی|ابجوساز|ابجوساختن|ابجو|ابتین|ابتنی|اب‌پنیر|اگهی' \
    + ur'|اب‌پاش|اب‌بها|اب‌بند|اب‌باز|اب‌انبار|ابان|اباژور|اباده|ابادکردن|ابادسازی|ابادان|اباد|اباء'  # first charcter should be آ

# removed ان for [[ان بی سی]]
# match ZWNJ also as a space or optional

wordsWithA = wordsWithA.replace(ur"\u200c", u'[\u200c ]?')

PresentVerbsWithA = \
    ur'ارا|ارام|ارامان|ارای|ازار|ازما|ازمای|اسا|اسای|اشام|اشوب|اغار|اغاز|افرین|اکن|اگن|الای' \
    + ur'|امرز|اموز|اموزان|امیز|اهنج|اور|اویز'

PastVerbsWithA = \
    ur'اراماند|ارامید|ارمید|ازرد|ازمود|اشامید|اشفت|اشوبید|اغازید|اغشت|افرید|اکند|اگند|الود' \
    + ur'|امد|امرزید|اموخت|اموزاند|امیخت|اهیخت|اورد|اویخت'

needsNasb = \
    ur'اتفاقا|الزاما|لزوما|یقینا|قطعا|حتما|قاعدتا|طبیعتا|طبعا|قهرا|جدّا|حقیقتا|واقعا|مطمئنا|واضحا|مسلما|تماما|کاملا' \
    + ur'|عینا|اکیدا|مطلقا|دقیقا|مستقیما|اصولا|اصلا|اصالتا|نسبا|نسبتا|تقریبا|حدودا|معمولا|قانونا|شرعا|اخلاقا|خلقا|احتمالا' \
    + ur'|استثنائا|اساسا|کلّا|جزئا|مجموعا|جمعا|اجماعا|شدیدا|نهایتا|اقلا|اکثرا|غالبا|عمدتا|ندرتا|بعضا|گاها|صریحا|صراحتا|عموما' \
    + ur'|اختصاصا|خصوصا|مجملا|اجمالا|اختصارا|مختصرا|مشروحا|ظاهرا|باطنا|عمیقا|ذاتا|فطرتا|جسما|ابتدائا|مقدمتا|بدوا|بعدا|قبلا' \
    + ur'|جدیدا|سابقا|اخیرا|ابدا|عمرا|تلویحا|علنا|حضورا|غیابا|نیابتا|لطفا|اجبارا|اختیارا|عالما|عمدا|عامدا|تعمدا|متعمدا|عادتا' \
    + ur'|مستقلا|احتیاطا|احیانا|غفلتا|سهوا|اشتباها|عاجلا|عجالتا|مرتجلا|ارتجالا|سریعا|فورا|دا[یئ]ما|ضرورتا|نقدا|منحصرا|صرفا|دفعتا' \
    + ur'|کرارا|مکررا|مجددا|مرتبا|مستمرا|متواترا|تدریجا|تصادفا|عملا|فعلا|موقتا|ضمنا|نتیجتا|نوعا|اصطلاحا|جسارتا|بالا ?غیرتا|م[وؤ]کدا' \
    + ur'|ذیلا|شخصا|مشترکا|مفصلا|رسما|ترجیحا|قلبا|ر[اأ]سا|تو[اأ]ما|متناوبا|متوالیا|متقابلا|متعاقبا|متّ?فقا|مثلا|فرضا|ایضا|مضافا' \
    + ur'|مصرّ?ا|ارفاقا|انصافا|جهارا|طولا|متدرجا|غانما|احتراما|ناچارا|سفارشا|تلفنا|زبانا|کتبا|شفاها|چهارما|ثانیا|ثالثا' \
    + ur'|رابعا|خامسا|سادسا|سابعا|ثامنا|تاسعا|عاشرا|مخصوصا'

HamzehZam = \
    ur'امیرالمومنین|مومن|رویا|فواد|موذن|مودب|موخر|مواخذه|مولف|موثر|مونث|موکد|موسس(?! خورناتسی)|سوال|موسسه'  # for[[ران مودی]]removedمودی
HamzehZam = HamzehZam.replace(ur'\u0648', ur'وء?')

HamzehNasb = \
    ur'تاکید|تالیف|تاسیس|تاسیسات|تامل|تفال|تاهل|تامین|تا[یئ]ید|تادیب|تاثیر|تاثر|تاثیرات|تاثیرگذار|تاجیل' \
    + ur'|تاخر|تاخیر|توام|ماوا|مستاجر|مبدا|منشا|متاسفانه|متاسف|متاثر|مساله|متاهل|خلا|ملا عام|رافت|ماخذ|مایوس|ماخوذ' \
    + ur'|مامور|مامورین|ماموران|ماموریت|مامون|مانوس'  # removed راس، تالم

HamzehAtEnd = \
    ur'اجزا|احشا|ارتجا|ارتقا|ازا|استثنا|استغنا|استقرا|استمنا|استهزا|اشبا|اشقیا|اشیا|اطبا|اطفا|اعتلا' \
    + ur'|اغوا|افترا|اقتضا|امنا|انبیا|انقضا|اولیا|ماورا'  # re املا-انشا-اعضا-امضا-انزوا-ابتلا-استعفا-اعلا-اعتنا بدون همزه متداولترند، ابدا می‌تواند با همزه یا نتوین باشد در نتیجه برداشته شد

HamzehAtInside = {ur'سو': u'استفاده|تعبیر|تفاهم|برداشت',
                  ur'ما': u'الشعیر', ur'ماورا': u'الطبیعه|النهر'}

AlefMaghsooreh = \
    ur'یحیا|حتا|خنثا|مبرا|مرتضا|مصطفا|موسا|مجتبا|عیسا|عظما|علارغم'  # removed اولا- الا

colorsNames = \
    ur'زرد|قرمز|آبی|سفید|سیاه|بنفش|سرخ|گلگون|ازرق|ابیض|نارنجی|توسی|کبود|ارغوانی|سورمه‌ای|سپید|مشکی|کرم|قهوه‌ای|سبز|طلا[یئ]ی'

persianNumbers = \
    ur'یک|دو|سه|چهار|پنج|شش|هفت|هشت|نه|ده|یازده|دوازده|سیزده|چهارده|' \
    + ur'پانزده|شانزده|هفده|هجده|نوزده|بیست|سی|چهل|پنجاه|شصت|هفتاد|هشتاد|نود|صد|هزار'

addToAbad = ur'گلون|افضل|رقی|خیر|دل|حاجی|سید|مبارک|گنج|نهنگ|چنگ|' \
            + ur'سرخ|جنگل|خرم|خونی|دولت|به|نیاز|حفظ|عیش|نجم|بلاش|شیار|' \
            + ur'فتح|فضل|خدر|ساق|کج|زین|اسلام|بالش|پارس|اسکل|یاخچی|مهندس|قوژد'

firstNameComplex = {
    ur'حمید|احمد|محمود': u'رضا',
    ur'خدا': ur'بنده|داد',
    ur'امیر': ur'علی|حسین|محمد|رضا|مهدی|عباس',
    ur'محمد': ur'حسین|رضا|مهدی|جواد|باقر|کاظم|حسن|علی|امیر|طاها|هادی|وحید|حمید',
    ur'علی': ur'رضا|محمد|اصغر|اکبر|قلی',
}

complexes = {  # اسم خاص
    # اسم مرکب
    # فعل
    # صفت مرکب
    # 'با': u'پرستیژ|ابهت|احساس|اخلاق|ادب|ارزش|استعداد|استقامت|اصالت|اقتدار|اهمیت|تدبیر|تربیت|تسلط|تعصب|تقوی',
    # 'باقی|ته': u'مانده', bug > باقی مانده بود- ته مانده بود.
    # طبق بندهای    شماره ..
    # 'طبق|زمان': u'بند',
    # 'مادر|خواهر|برادر|فرزند|پدر': u'خوانده', # bug > وی پدر خوانده شد.(پدر صدا زده شد)
    ur'ویکی': u'پدیا|مدیا|انبار|واژه|نبشته|خبر|کتاب|داده|دیتا|سفر|تراول|دانشگاه',
    ur'ایده': u'آل',
    ur'سخت|نرم|پای|جنگ|نوشت|بد|ماشین': u'افزار',
    ur'جنگ': u'افروز',
    ur'پیاده': u'روی|رو|نظام',
    ur'انسان|روان|گیاه|زیست|جانور|نماد|زمین|هوا|ریخت|خدا|جامعه|رفتار|فرهنگ|معرفت|زبان|کتاب|ستاره|اختر|شرق|اسلام|ریشه|آسیب|باستان|حق': u'شناس',
    ur'بهره|نتیجه|فاصله|اندازه|مچ|رونق|دست|پا|پاچه|آبمیوه|آتش|آمار|اوج|کشتی|رأی|رای|یار|تصمیم': u'گیر',
    ur'بهره': u'مند|کشی|دهی',
    ur'اوج': u'دهی',
    ur'آزاد|بد|نیک|مثبت|مصلحت': u'اندیش',
    ur'هم': u'اندیشی|ارزی|راهی|سانی|رزم|خانه|نشین|سان|بند|مرز|سایه|مسلک|زمان|معنی|گام',
    ur'گرم|نرم|سرد|جمع|خنک|خشک|مرطوب|ضرب|تقسیم|کم|سرگرم|خوشحال|ناراحت|سخت|روان|باز|زیبا|زشت|مصرف|تولید': u'کننده|کنندگی|کنندگان',
    ur'خود|درون|پیه': u'سوز|خواه',
    ur'دل': u'افروز|آزار|آرا|آزرده|بریده|افسرده|ربا|سوز|خواه|گشا',
    ur'تفریق|افزایش|کاهش|ویرایش|کوزه|سفال|غارت|چپاول|صنعت|امداد|توطئه|حساب|افسون|ریخته': u'گر',
    ur'آهن': u'ربا',
    ur'طیف|امکان|اقتصاد|نور|زمان|عمق|گرما|فشار|قطر': u'سنج',
    ur'فیزیک|شیمی|ریاضی|تاریخ|قلم|کتاب': u'دان',
    ur'نام|اسم|سیاهه|خود|فیلم‌نامه|فیلمنامه|کتاب|روان|نسخه': u'نویس',
    ur'بار|سرمایه|تخم|کتاب|خواب': u'گذار',
    ur'شهر': u'بانو|زاد|ناز|نوش',
    ur'اسد|اسماء?|اسم|امان|امر|امیر|امین|انصار|انعام|اهل|اولیاء?|اکرم|باب|بدیع|برات|بقیة|بهاء?|جار|جند|حبیب|حجت|حزب|حفظ|حمد|خلق|خلیل|خیر|ذبیح|ذکر|رام|رحمت|رحم|رسول|روح|سیف|شمس|شکر|صدق|صدیق|عبد|عزت|عزیز|عین|فتح|فرج|فضل|قدرت|لطف|لعنت|نصرت|نصر|نظیر|نعمت|نور|هیبت|ولی|کلام|کلیم|ید|یوم': u'الله|اللهی',
    ur'مستند|هوا|روان|جریان|کار|مجسمه|ایمن|پیاده|مقاوم|امن|ساده|بهینه|مرتب|شبیه|ویکی|پل|جاده|راه': u'ساز',
    ur'احترام|اختلاف|اضطراب|اعجاب|افتخار|بحث|بر|تحسین|ترحم|تعجب|تعصب|تنفر|ت[اأ]ثر|ت[اأ]سف|ت[اأ]مل|جالب|جدل|جنجال|حزن|حیرت|خفت|خوف|خیال|چالش|دل|رعب|رقت|روح|شهوت|شور|شوق|شگفت|طرب|عبرت|غرور|غم|فرح|ملال|مهر|نشاط|نفرت|هراس|هوس|وحشت|ی[اأ]س': u'برانگیز|انگیز',
    ur'چهره|دور|تاریخ|خبر|روزنامه|روز|لرزه': u'نگار',
    ur'خود|روان|پاک|چرک|دست|پشت|زیر|پا|داستان': u'نویس',
    ur'زود|آرام|آب|کله|آش|بخار': u'پز',
    ur'مه|پیمان|یخ|سنگ|بت|صف': u'شکن',
    ur'خون': u'آشام|خوار|بار|گرم|سرد|بها',
    ur'شیطان|خدا|بت|خورشید|مهر|آتش|یزدان|ایزد|گاو|خود|آفتاب|یکتا|پول|حق|مال|میهن|نژاد': u'پرست',
    ur'پا[یئ]ین|بالا|عقب|جلو|کنار|ساده|بزرگ|کوچک|عمیق|رقیق|ضخیم|فهیم|گسترده': u'تر',
    ur'برگشت|انحنا|برش|انعطاف|مهمان|امکان|تفکیک|تغییر|آسیب|تأثیر|دل|سازش|مهاجر': u'پذیر|ناپذیر',
    ur'دانش': u'آموخته|پژوه|آموختگی',
    ur'بی': u'آلایش|ابهت|احترام|احساس|اختیار|اخلاق|ادب|اراده|ارزش|استعداد|استقامت|اصالت|اعتماد|اعتبار|اقتدار|امان|امنیت|انتها|اهمیت|بها|بو|تدبیر|تربیت|تسلط|تعصب|تقوی|توجه|ثبات|جنبه|حس|دریغ|دست و پا|دین|رنگ|روح|رویه|سابقه|سیم|شرف|شعور|لیاقت|مایه|مبالات|مزد|مزه|مصرف|معرفت|معنی|مقدار|مورد|نتیجه|نزاکت|نهایت|نیاز|وجدان|پایه|پرستیژ|پناه|پول|چاره|چیز|کار|دلیل|خبر',
    ur'می': u'دانم',
    ur'عرضه': u'کننده|کنندگان',
    ur'ابرو': u'کمان|قیطان',
    ur'ابله': u'گونه',
    ur'ابن': u'الیوم|الوقت|السبیل|عباس',
    ur'اغراق|خشونت': u'آمیز',
    ur'اجاق': u'کور|زاده|سوز',
    ur'اجل': u'برگشته',
    ur'اسفل': u'السافلین',
    ur'اطلاع': u'رسان|رسانی|دهی',
    ur'انگشت': u'نما|نشان|پیچ',
    ur'سپاس|نام': u'گزار',
    ur'گوشت|گیاه|علف|شیر': u'خوار',
    ur'آدم': u'برفی|فروش|ربا|خوار',
    ur'آب': u'لمبو|تنی',
    ur'آتشین': u'پنجه',
    ur'ریش|سنگ|قلم': u'تراش',
    ur'آزرده': u'جان',
    ur'آسوده': u'خاطر|وجدان',
    ur'آسیمه': u'سر',
    ur'آش': u'دهن|خور|پز',
    ur'آشفته': u'سامان|دماغ|روز',
    ur'آکنده': u'گوش|پهلو',
    ur'آلاخون': u'والاخون',
    ur'آمد': u'نیامد|شد',
    ur'باب': u'الحوائج',
    ur'باد': u'نشسته|گرفته',
    ur'بار': u'خاطر',
    ur'بالا|پایین|پائین': u'تنه',
    ur'برنامه': u'نویس',
    ur'برنامه|طرح|بتون': u'ریز',
    ur'بزرگ': u'سال|مرد',
    ur'بزن': u'دررو|بهادر',
    ur'بد|خوش': u'سیرت|اخلاق|تراش|ترکیب|ریخت|ادا|استیل|اندام|بو|بینانه|بینی|پخت|برخورد|یمن|خوراک|خیم|رکاب|حال|مزه|حساب|پوش|اقبال|قلق|منظر|نام|نما',
    ur'بد': u'انجام|پیله|خوی|عنق|کاره|گمان|گوهر|لگام|مسب|مست|مهر',
    ur'بن': u'بست',
    ur'به': u'غایت',
    ur'حمله|بهره|پیشه|شعله|طاعت|طالع': u'ور',
    ur'بین': u'النهرین|الملل|الممالک',
    ur'پاچه': u'ورمالیده',
    ur'تکه|پاره|آتش|آهن|جگر|چهار': u'پاره',
    ur'ترویج|امداد|جهاد': u'گران|گر',
    ur'جهان|خدا|سود|شفا|نیرو|گرما|سرما': u'بخش',
    ur'پاک': u'نفس|سرشت|دامن|سیرت|منش|دیده',
    ur'پالان': u'سا[یئ]یده|دوز',
    ur'پراگنده|تاریک|شکسته|آشفته|آزرده|آسوده|بد|خوش|خونین|سیاه|نازک': u'دل',
    ur'پری': u'نژاد|چهر',
    ur'نیک|پست': u'فطرت',
    ur'پی': u'گم|گرد|فراخ|سپید|نوشت',
    ur'پیچ': u'واپیچ|پیچ',
    ur'سفید|سیاه|قهوه‌ای|قرمز|زرد|سبز|بنفش|گلگون|سرخ|پیروزه|مشک|نیل|مشکین': u'فام',
    ur'پیش': u'مرگ|کسوت',
    ur'تازه': u'وارد|خط|نفس|کار',
    ur'تام': u'الاختیار',
    ur'خوش|زشت|ترش': u'رو',
    ur'ترگل': u'ور گل',
    ur'تکه': u'تکه',
    ur'تن': u'فروش|آسان|آرا|تن|پرور',
    ur'تند': u'خو|خوی',
    ur'تنگ': u'چشم',
    ur'تی': u'تیش',
    ur'پا|تن|زیر|سبز|سرخ|قرمز': u'پوش',
    ur'تیره': u'روز',
    ur'جامع': u'الشرایط|الاطراف',
    ur'جان': u'سخت|جانی',
    ur'یدک|فرو|نسل|آدم|ویروس|نقشه|سر|آب|آچار': u'کش',
    ur'کشتی|گرده|دشت|نگه|دید|زمین|جنگل|دروازه': u'بان',
    ur'چابک': u'سوار|دست',
    ur'نقاره|چاپ': u'چی',
    ur'چرب': u'زبان|ترازو',
    ur'چشمه': u'چشمه',
    ur'چل': u'کلید|تاج|تکه',
    ur'ناقاره|چوبک|دف|دمبک|ساز|نی|سنتور|تار|گیتار|ارگ': u'زن',
    ur'چیره': u'دست',
    ur'پول|فنگ|قالی|ظرف|خشک|لباس': u'شو[ئی]ی',
    ur'چیز': u'فهم',
    ur'حرف': u'شنو',
    ur'حق': u'السکوت|التدریس|الزحمه',
    ur'حکیم': u'باشی',
    ur'حرام|حلال': u'زاده',
    ur'حیرت': u'زده',
    ur'حیرت|نام|مقام|یاد|خواب|درد|شگفت|جمع': u'آور',
    ur'خاله': u'زنک',
    ur'خام': u'طمع|طبع',
    ur'خشک': u'سر',
    ur'خنده': u'رو|خریش',
    ur'خواجه': u'سرا|تاش',
    ur'سگ|مرغ|خوک': u'دانی',
    ur'خونین': u'جگر|چشم|شهر',
    ur'دایم': u'الخمر',
    ur'دائم': u'الصوم|الخمر',
    ur'درشت': u'خو',
    ur'دست': u'نویس|خوش|پاچه|چین|آورد',
    ur'دم': u'کلفت',
    ur'دندان': u'گرد',
    ur'دودوزه': u'باز',
    ur'ذوات': u'الارحام|الاذناب',
    ur'ذوی': u'القربی|الاوتار|العقول',
    ur'ذی': u'نفع|صلاحیت|فقار|ربط|قیمت|شعور|علاقه|حیات|فن|روح|عقل|حق',
    ur'چشم|بار|بر|پس|تیر|رو|زیر|غلط': u'انداز',
    ur'رای': u'دهنده|دهندگان',
    ur'راست': u'راستکی',
    ur'رحمت': u'العالمین',
    ur'رسم': u'الخط',
    ur'رقیق': u'القلب|الفکر',
    ur'رنگ': u'وارنگ',
    ur'اندود': u'کاری',
    ur'سنگ|ریز|دانه|تک|یک|بزرگ|رنگ': u'دانه',
    ur'رو[یئ]ین|پاد|نرم|سخت': u'تن',
    ur'ریش': u'ریش',
    ur'رئیس': u'الوزراء|الرؤسا',
    ur'تصویب|کار|اجازه|تکذیب|شب|پایان|اساس|آ[یئ]ین': u'نامه',
    ur'زنگی': u'مزاج',
    ur'زوار': u'دررفته',
    ur'زیست': u'محیط|بوم',
    ur'سابق|اخیر|فوق|لازم': u'الذکر',
    ur'سابقه': u'سالار',
    ur'سبک': u'مغز|سنگ|عنان|روح|لقا|سایه|سنگین|دست',
    ur'سربه': u'مهر',
    ur'سریع': u'السیر|الانتقال',
    ur'سست': u'زخم|رگ|ریش|عنصر',
    ur'سنگ': u'فرش',
    ur'دو|سه|چهار': u'پایه',
    ur'سیاه': u'مست|سوخته|چرده',
    ur'سینه': u'چاک',
    ur'شب': u'رنگ|پره|اداری',
    ur'شبانه': u'روزی',
    ur'شکسته': u'ناخن|مزاج',
    ur'شلم': u'شوربا',
    ur'شوخ': u'طبع|رو|دیده|چشم',
    ur'شوم|نیک|بلند|بد': u'اختر|اقبال',
    ur'شوی': u'دیده',
    ur'شیرین': u'عقل|دهن',
    ur'صد': u'شاخ',
    ur'قتل|بار': u'عام',
    ur'صف': u'آوار',
    ur'ضرب': u'المثل|العجل',
    ur'طبقه|زمان|درجه|رده|رتبه|دسته|جمله|تقسیم|بسته|آرماتور|اسکلت|امتیاز|بخش|جدول|جمع|جناح|رنگ|ساز|سایز|سرهم|سطح|شرط|شکم|فاز|فصل|قاب|پارتیشن|چشم|کادر|کمر|گاو|نیم': u'بند',
    ur'طوطی': u'وار',
    ur'طویل': u'المدت',
    ur'طی': u'الارض',
    ur'هنر|عاشق': u'پیشه',
    ur'عالی': u'نسب',
    ur'عام': u'المنفعه',
    ur'عدیم': u'النظیر',
    ur'عقب': u'گرد|نشینی',
    ur'علی': u'البدل',
    ur'عیال': u'وار',
    ur'غلط': u'غلوط',
    ur'فارغ': u'الاکناف|التحصیل',
    ur'فراخ': u'رو|شکم|بال|کام|دیده|سخن|آهنگ|دست|آستین|ابرو|روزی',
    ur'فرخ': u'لقا|دیم|فال|پی',
    ur'فرمان': u'روا|بر',
    ur'فرنگی': u'مآب',
    ur'غیر': u'قابل|متعهد|اخلاقی|شرعی|انسانی|اصولی|مجاز|حضوری|دولتی|نظامی|انتفاعی|منتظره|قانونی|معمولی|ممکن|رسمی|فعال|نفتی|منقول|ارادی|جایز|طبیعی|عادی|عمد|لازم|مسئول|عادلانه|خودی|عاقلانه|کافی',
    ur'وفا|فره|نیاز|جفا|خرد|غیرت|باور|ارزش|نعل|درد|علاقه': u'مند',
    ur'فرو': u'نهادن|داشت|گذاشت|مایه|بست|پاشی|پاشیده',
    ur'فوق': u'الذکر',
    ur'خارق|فوق': u'العاده',
    ur'کیلو|سانتی|میلی|دسی|نانو|ولت': u'متر|آمپر|گرم',
    ur'قاچ': u'قاچ',
    ur'قافله': u'سالار',
    ur'قایم': u'الزاویه',
    ur'قدسی': u'مآب',
    ur'قره': u'قاطی',
    ur'قریب': u'الوقوع',
    ur'کاه|قطره|دله|آفتابه': u'دزد',
    ur'قوی': u'پنجه',
    ur'قیمه': u'قیمه',
    ur'کاسه': u'یکی|سیاه|لیس',
    ur'کج': u'نهاد|خلق|کلاه',
    ur'کلاه': u'گوشه|گذار',
    ur'کله': u'معلق|خشک|گنده|خر|شق|پوک',
    ur'زبانه|زمین|ماشین|فرمان|کمان|کنگره|گوشه|دامنه|خانه|پول|مقام|آ[یئ]ینه': u'دار',
    ur'کهن': u'سال|دیار',
    ur'کینه': u'توز|ورز',
    ur'گران': u'مغز|سایه|قدر|رکاب|سرشت|پایه|قیمت|روح|سنگ|جان|سر|فروش',
    ur'گربه': u'گون|کوره',
    ur'گشاده': u'رو|دست',
    ur'گل': u'چهره|ریزان|ریز|گون|باران|آرا|اندام|برگ',
    ur'گلوله': u'باران',
    ur'ناهم|هم|گندم': u'گون',
    ur'لازم': u'الوصول|الاجراء',
    ur'مشکوک|معلوم|مجهول|فارغ': u'الحال',
    ur'لت': u'لت|انبان|انبار',
    ur'لسان': u'الغیب',
    ur'مالک': u'الرقاب',
    ur'ماه': u'طلعت',
    ur'مشغول': u'الذمه',
    ur'معظم': u'له|القدر',
    ur'ملی|همجنس|زمینه': u'گرا',
    ur'میرزا': u'قلمدان|قشمشم|بنویس',
    ur'ناخن': u'خشک',
    ur'نازک': u'نی|نارنجی|خیال',
    ur'جهان|نافه': u'گشا',
    ur'ندید': u'بدید',
    ur'نظریه|رویا|رؤیا': u'پرداز',
    ur'نقشه|وزنه|بهره|کلاه': u'بردار',
    ur'نق': u'نقو',
    ur'نگون': u'طشت|بخت',
    ur'نیک': u'روز|انجام|پی|اختر|بخت',
    ur'نیم': u'ته|بسمل',
    ur'هرکن': u'پرکن',
    ur'همایون': u'فال|آثار|بخت',
    ur'همه': u'کاره|جانبه',
    ur'هیچ': u'کاره|گاه|یک|کس|کدام',
    ur'ول': u'خرج|معطل',
    ur'یکه': u'شناس|بزن|سوار|تاز',
    ur'ابجد': u'خوان',
    ur'ابر': u'آلود|قدرت|ابزار',
    ur'ابو': u'العجب|الکلام|الهول',
    ur'اولو': u'الالباب|الامر|العزم',
    ur'حسب|صاحب|واجب': u'الامر',
    ur'گل|آذر': u'گون',
    ur'آزاد': u'مرد|وار',
    ur'باز': u'خرید|خواست|دید|بین',
    ur'بر': u'هم|آشفتگی|آشفته|پایی',
    ur'بلند': u'آوازه|پایه',
    ur'آتش': u'بس|نشان|سوزی|افروز|افکن|افزار',
    ur'پا': u'برجا|برهنه|بست|پتی|کار',
    ur'پایه|بنیان': u'گذار|گذاری',
    ur'پر': u'ابهام|ابهت|اتلاف|ادا|ادویه|ازدحام|استرس|استقامت|اشک|برخورد|ترانه|تردد|ترشح|تشبیه|تصادف|تعصب|تقلب|تلاش|تملق|شور',
    ur'کم': u'محل|بضاعت|کم|یاب',
    ur'پر|کم': u'نظیر|کار|تعداد|اشتباه|اشکال|اهمیت|تحرک|تحول|ترافیک|تراکم|تقاضا|تکرار|تنش|تنوع|رو|آب',
    ur'تنگا': u'تنگ',
    ur'تیز': u'پا|دست|دندان|هوش|بین',
    ur'چادر|تخت|زاغه|شهر|ته|آب|کاخ|پایتخت|یکجا|ییلاق': u'نشین',
    ur'چهار': u'شانه',
    ur'ویروس': u'شناس|یاب',
    ur'یاد': u'داشت|دهی',
    ur'یار': u'کشی',
    ur'ی[اأ]س': u'آلود',
    ur'حاضر': u'جواب|یراق',
    ur'خرد': u'سال',
    ur'دو': u'برجی|تخمه|سره|قلو|به‌شک',
    ur'ذو': u'الجلال|العرش|القدر|القوافی|اللسانین|المجد|المکارم|المن|المناقب|المنن|النور|الوجهین|جسدین',
    ur'رنگا': u'رنگ',
    ur'رو': u'سفید|سیاه|باز',
    ur'قهوه|نگار|آبدار|گل|کتاب': u'خانه',
    ur'روز': u'افزون|انه',
    ur'زود': u'باور',
    ur'شاد': u'روان|کام|مان|مانه',
    ur'فرا': u'خور|روی',
    ur'کد': u'خدا|بانو',
    ur'گردا': u'گرد',
    ur'لا': u'ابالی|جون|کردار|مذهب|مروت|یتغیر|یتناهی|یزال|یعقل',
    ur'نا': u'جوانمرد|خودآگاه|نجیب|امید|آزموده|آشنا|آگاه|برابر|تمام',
    ur'ایمن|پیاده|مقاوم|امن|ساده|بهینه|مرتب|آماده|رها|آگاه|زیبا|یکسان|روان|ذخیره|استاندار|متمایز|جدا|شخصی|انبوه|خصوصی': u'سازی',
}

# ----------------------------------------Wrong dictations-----------------------

forReplace = {  # 'میسیسیپی': u'می‌سی‌سی‌پی',
    # 'هاوی': u'حاوی', ممکن است اسم خاص باشد
    # 'سوماً': u'سوم',
    # 'سوما': u'سوم',
    # 'دوماً': u'دوم',
    # 'دوما': u'دوم',
    # 'جانا': u'جانی', باگ در [[جانا رودین]]
    # 'طوسی': u'توسی', خواجه نصیرالدین طوسی را به تبدیل می کرد
    # برپایه http:#www.persianacademy.ir/fa/pishvand.aspx
    # بدل از تنوین
    ur'به شخصه': u'بشخصه',
    ur'به‌شخصه': u'بشخصه',
    ur'به عینه': u'بعینه',
    ur'به‌عینه': u'بعینه',
    ur'احمدی نژاد': u'احمدی‌نژاد',
    ur'جابه جا': u'جابه‌جا',
    ur'جا به جا': u'جابه‌جا',
    ur'جا به‌جا': u'جابه‌جا',
    ur'بی بی سی': u'بی‌بی‌سی',
    ur'اف بی آی': u'اف‌بی‌آی',
    ur'می سی سی پی': u'می‌سی‌سی‌پی',
    ur'ویژه‌گی': u'ویژگی',
    ur'دایره‌المعارف': u'دایرةالمعارف',
    ur'دایره المعارف': u'دایرةالمعارف',
    ur'تأئید': u'تأیید',
    ur'تائید': u'تأیید',
    ur'بقیه‌الله': u'بقیةالله',
    ur'بقیه الله': u'بقیةالله',
    ur'بقیة الله': u'بقیةالله',
    ur'دگمه': u'دکمه',
    ur'وحله': u'وهله',
    ur'نقطه‌نظر': u'دیدگاه',
    ur'ناچاراً': u'به‌ناچار',
    ur'ناچارا': u'به‌ناچار',
    ur'منیت': u'منی',
    ur'منیٔت': u'منی',
    ur'فرآیند': u'فرایند',
    ur'فرآیندها': u'فرایندها',
    ur'کارآیی': u'کارایی',
    ur'ملاحضه': u'ملاحظه',
    ur'ملیون': u'میلیون',
    ur'ملیارد': u'میلیارد',
    ur'مطمعن': u'مطمئن',
    ur'مرهمت': u'مرحمت',
    ur'مرحم': u'مرهم',
    ur'محصوب': u'محسوب',
    ur'مذبور': u'مزبور',
    ur'متعصفانه|متاصفانه': u'متأسفانه',
    ur'متغییر': u'متغیر',
    ur'لشگر': u'لشکر',
    ur'لحجه': u'لهجه',
    ur'گاهاً': u'گاهی',
    ur'گاها': u'گاهی',
    ur'کهکیلویه': u'کهگیلویه',
    ur'قائله': u'غائله',
    ur'فارق‌التحصیل': u'فارغ‌التحصیل',
    ur'علاالدین': u'علاءالدین',
    ur'علم‌شنگه': u'الم‌شنگه',
    ur'غلطاندن': u'غلتاندن',
    ur'ظبط': u'ضبط',
    ur'طنبور': u'تنبور',
    ur'طپش': u'تپش',
    ur'ضمینه': u'زمینه',
    ur'زخامت|ذخامت': u'ضخامت',
    ur'زخیم|ذخیم': u'ضخیم',
    ur'صحفه': u'صفحه',
    ur'سفارشاً': u'سفارشی',
    ur'سفارشا': u'سفارشی',
    ur'سرلشگر': u'سرلشکر',
    ur'سپاسگذار': u'سپاسگزار',
    ur'خبرگذار': u'خبرگزار',
    ur'ساتع': u'ساطع',
    ur'زنده‌گی': u'زندگی',
    ur'زباناً': u'زبانی',
    ur'زبانا': u'زبانی',
    ur'رهبریت': u'رهبری',
    ur'در باره': u'درباره',
    ur'دوئیت': u'دوگانگی',
    ur'داوطلبین': u'داوطلبان',
    ur'خوشنود': u'خشنود',
    ur'خوبیت': u'خوبی',
    ur'خوانواده': u'خانواده',
    ur'خواستگاه': u'خاستگاه',
    ur'خرشید': u'خورشید',
    ur'خردن': u'خوردن',
    ur'خانند': u'خوانند',
    ur'خابیدن': u'خوابیدن',
    ur'حظور': u'حضور',
    ur'حظرت': u'حضرت',
    ur'حدلامکان': u'حتی‌الامکان',
    ur'حاظر': u'حاضر',
    ur'چهارماً': u'چهارم',
    ur'چهارما': u'چهارم',
    ur'چارشنبه': u'چهارشنبه',
    ur'جاناً': u'جانی',
    ur'توجیح': u'توجیه',
    ur'توضیع': u'توزیع',
    ur'تلوزیون': u'تلویزیون',
    ur'تضاهر': u'تظاهر',
    ur'ترجیه': u'ترجیح',
    ur'پنچ': u'پنج',
    ur'پزشگی': u'پزشکی',
    ur'پرفسور': u'پروفسور',
    ur'پاتوغ': u'پاتوق',
    ur'بی‌مهابا': u'بی‌محابا',
    ur'بنیانگزار': u'بنیانگذار',
    ur'بلقور': u'بلغور',
    ur'بلاخره': u'بالاخره',
    ur'برخواستن': u'برخاستن',
    ur'برعلیه': u'علیه',
    ur'برخواست': u'برخاست',
    ur'بدیت': u'بدی',
    ur'باطلاق': u'باتلاق',
    ur'بازرسین': u'بازرسان',
    ur'بارگزار': u'بارگذار',
    ur'باجناق': u'باجناغ',
    ur'باباقوری': u'باباغوری',
    ur'آروق': u'آروغ',
    ur'انظباط': u'انضباط',
    ur'التفاط': u'التفات',
    ur'افضل‌تر': u'بهتر',
    ur'افسنطین': u'افسنتین',
    ur'اعلم‌تر': u'داناتر',
    ur'اطو': u'اتو',
    ur'اطراق': u'اتراق',
    ur'اطاق': u'اتاق',
    ur'اصطرلاب': u'اسطرلاب',
    ur'ارتقاع': u'ارتقا',
    ur'اختاپوث': u'اختاپوس',
    ur'ابولفضل': u'ابوالفضل',
    ur'امپراطور': u'امپراتور',
    ur'آزوقه': u'آذوقه',
    ur'ذکام': u'زکام',
    ur'بگیر و ببند': u'بگیر ببند',
    ur'ساز و کار': u'سازوکار',
    ur'جر و بحث': u'جربحث',
    ur'خوار و بار': u'خواربار',
    ur'احجام': u'حجم‌ها',
    ur'اقشار': u'قشرها',
    ur'لازم به ذکر است': u'لازم است ذکر شود',
    ur'بدلیل': u'به دلیل',
    ur'آن‌را': u'آن را',
    ur'این‌را': u'این را',
    ur'هیات': u'هیئت',
    ur'هیأت': u'هیئت',
    ur'رییسه': u'رئیسه',
    ur'رییس': u'رئیس',
    ur'مساله': u'مسئله',
    ur'مسأله': u'مسئله',
    ur'همین جا': u'همین‌جا',
    ur'همینجا': u'همین‌جا',
    ur'همینطور': u'همین‌طور',
    ur'همین طور': u'همین‌طور',
    ur'همان جا': u'همان‌جا',
    ur'همانجا': u'همان‌جا',
    ur'همان طور': u'همان‌طور',
    ur'همانطور': u'همان‌طور',
    ur'هیچکدام': u'هیچ‌کدام',
    ur'هیچ کدام': u'هیچ‌کدام',
    ur'هیچکس': u'هیچ‌کس',
    ur'هیچ کس': u'هیچ‌کس',
    ur'هیچیک': u'هیچ‌یک',
    ur'هیچ یک': u'هیچ‌یک',
    ur'هم‌دیگر': u'همدیگر',
    ur'آن چه': u'آنچه',
    ur'آن‌چه': u'آنچه',
    ur'چنان چه': u'چنانچه',
    ur'چنانچه': u'چنانچه',
    ur'چنان که': u'چنان‌که',
    ur'چنانکه': u'چنان‌که',
    ur'ئیدروژن': u'هیدروژن',
    ur'بعضن': u'بعضاً',
    ur'غالبن': u'غالباً',
    ur'کاملن': u'کاملاً',
    ur'احتمالن': u'احتمالاً',
    ur'اصلن': u'اصلاً',
    ur'اشتباهن': u'اشتباهاً',
    ur'منشاء': u'منشأ',
    ur'مبداء': u'مبدأ',
}

persianGlyphs = {  # these two are for visually available ZWNJ #visualZwnj
    ur'\u200cه': u'ﻫ',
    ur'ی\u200c': u'ﻰﻲ',
    ur'أ': u'ﺄﺃﺃ',
    ur'آ': u'ﺁﺁﺂ',
    ur'إ': u'ﺇﺈﺇ',
    ur'\u0627': u'ﺍﺎ',
    ur'ب': u'ﺏﺐﺑﺒ',
    ur'پ': u'ﭖﭗﭘﭙ',
    ur'ت': u'ﺕﺖﺗﺘ',
    ur'ث': u'ﺙﺚﺛﺜ',
    ur'ج': u'ﺝﺞﺟﺠ',
    ur'چ': u'ﭺﭻﭼﭽ',
    ur'ح': u'ﺡﺢﺣﺤ',
    ur'خ': u'ﺥﺦﺧﺨ',
    ur'د': u'ﺩﺪ',
    ur'ذ': u'ﺫﺬ',
    ur'ر': u'ﺭﺮ',
    ur'ز': u'ﺯﺰ',
    ur'ژ': u'ﮊﮋ',
    ur'س': u'ﺱﺲﺳﺴ',
    ur'ش': u'ﺵﺶﺷﺸ',
    ur'ص': u'ﺹﺺﺻﺼ',
    ur'ض': u'ﺽﺾﺿﻀ',
    ur'ط': u'ﻁﻂﻃﻄ',
    ur'ظ': u'ﻅﻆﻇﻈ',
    ur'ع': u'ﻉﻊﻋﻌ',
    ur'غ': u'ﻍﻎﻏﻐ',
    ur'ف': u'ﻑﻒﻓﻔ',
    ur'ق': u'ﻕﻖﻗﻘ',
    ur'ک': u'ﮎﮏﮐﮑﻙﻚﻛﻜ',
    ur'گ': u'ﮒﮓﮔﮕ',
    ur'ل': u'ﻝﻞﻟﻠ',
    ur'م': u'ﻡﻢﻣﻤ',
    ur'ن': u'ﻥﻦﻧﻨ',
    ur'ه': u'ﻩﻪﻫﻬ',
    ur'هٔ': u'ﮤﮥ',
    ur'\u0648': u'ﻭﻮ',
    ur'ؤ': u'ﺅﺅﺆ',
    ur'ی': u'ﯼﯽﯾﯿﻯﻰﻱﻲﻳﻴ',
    ur'ئ': u'ﺉﺊﺋﺌ',
    ur'لا': u'ﻻﻼ',
    ur'لإ': u'ﻹﻺ',
    ur'لأ': u'ﻸﻷ',
    ur'لآ': u'ﻵﻶ',
}

def my_replace(match, word1, word2):
    match = match.group()
    return match.replace(word1, word2)

def quotation(text):
    # این تابع زمانی گیومه را به فارسی تیدیل می‌کند که در پاراگراف مورد نظر تعداد گیومهٔ لاتین زوج باشد.

    lines = text.split(ur'\n')
    result = []
    for i in range(0,len(lines)):
        line = lines[i]

        # رفع مشکل استفاده از ـً به جای گیومه لاتین در متن فارسی

        line = re.sub(ur'ا\"([ ]*[' + persianCharacters + ur'])', u'اً\\1',line)

        # ”“ تبدیل

        line = re.sub(ur'(^|[' + persianCharacters+ ur'\:>،»؛\s\n\}\]\.]+)“((?:\[\[|).*?['+ persianCharacters+ ur'\n]+?(?:\]\]|\.|\<|\:|))”(['+ persianCharacters+ ur'،«؛\s\n\.\[\{]|$)', u'\\1«\\2»\\3',line)
        # وارونه ”“ تبدیل

        line = re.sub(ur'(^|[' + persianCharacters
                            + ur'\:>،»؛\s\n\}\]\.]+)"((?:\[\[|).*?['
                            + persianCharacters
                            + ur'\n]+?(?:\]\]|\.|\<|\:|))"(['
                            + persianCharacters
                            + ur'،«؛\s\n\.\[\{]|$)', u'\\1«\\2»\\3',line)

        # وارونه ”“ تبدیل

        line = re.sub(ur'(^|[' + persianCharacters
                            + ur'\:>،»؛\s\n\}\]\.]+)”((?:\[\[|).*?['
                            + persianCharacters
                            + ur'\n]+?(?:\]\]|\.|\<|\:|))“(['
                            + persianCharacters
                            + ur'،«؛\s\n\.\[\{]|$)', u'\\1«\\2»\\3',line)

        # ‘’ تبدیل

        line = re.sub(ur'(^|[' + persianCharacters
                            + ur'\:>،»؛\s\n\}\]\.]+)‘((?:\[\[|).*?['
                            + persianCharacters
                            + ur'\n]+?(?:\]\]|\.|\<|\:|))’(['
                            + persianCharacters
                            + ur'،«؛\s\n\.\[\{]|$)', u'\\1«\\2»\\3',line)

        # وارونه ‘’ تبدیل

        line = re.sub(ur'(^|[' + persianCharacters
                            + ur'\:>،»؛\s\n\}\]\.]+)’((?:\[\[|).*?['
                            + persianCharacters
                            + ur'\n]+?(?:\]\]|\.|\<|\:|))‘(['
                            + persianCharacters
                            + ur'،«؛\s\n\.\[\{]|$)', u'\\1«\\2»\\3',line)

        # ‚’ تبدیل

        line = re.sub(ur'(^|[' + persianCharacters
                            + ur'\:>،»؛\s\n\}\]\.]+)‚((?:\[\[|).*?['
                            + persianCharacters
                            + ur'\n]+?(?:\]\]|\.|\<|\:|\{|\[|))’(['
                            + persianCharacters
                            + ur'،«؛\s\n\.\[\{]|$)', u'\\1«\\2»\\3',line)

        # „” تبدیل

        line = re.sub(ur'(^|[' + persianCharacters
                            + ur'\:>،»؛\s\n\}\]\.]+)„((?:\[\[|).*?['
                            + persianCharacters
                            + ur'\n]+?(?:\]\]|\.|\<|\:|))”(['
                            + persianCharacters
                            + ur'،«؛\s\n\.\[\{]|$)', u'\\1«\\2»\\3',line)

        # << >> تبدیل

        line = re.sub(ur'(^|[' + persianCharacters
                            + ur'\:>،»؛\s\n\}\]\.]+)\<\<((?:\[\[|).*?['
                            + persianCharacters
                            + ur'\n]+?(?:\]\]|\.|\<|\:|))\>\>(['
                            + persianCharacters
                            + ur'،«؛\s\n\.\[\{]|$)', u'\\1«\\2»\\3',line)

        # (()) تبدیل

        line = re.sub(ur'(^|[' + persianCharacters
                            + ur'\:>،»؛\s\n\}\]\.]+)\(\(((?:\[\[|).*?['
                            + persianCharacters
                            + ur'\n]+?(?:\]\]|\.|\<|\:|))\)\)(['
                            + persianCharacters
                            + ur'،«؛\s\n\.\[\{]|$)', u'\\1«\\2»\\3',line)
        result.append(line)
    return ur'\n'.join(result)

def dictationReplace(x,y,extensions,text):
    Regex=ur'(^|[^' + persianCharacters + ur'])(\s|\u200c|_|)(' + x + ur')(\s|_)('+ y + ur')(\s|\u200c|_|)(' + extensions + ur')(\n|[^' + persianCharacters + ur'])'
    text = re.sub(Regex,u'\\1\\2\\3\u200c\\5\\6\\7\\8',text)
    return text

def complex_replace(txt, pat, w1, w2):
    def function(s):
        return s.group(1)+s.group(2).replace(w1, w2,1)+s.group(3)+s.group(4)
    txt=re.sub(re.compile(pat),function,txt)
    return txt

def dictation(text):
    for i in complexes:
        if complexes.has_key(i):
            text = dictationReplace(i, complexes[i],
                                    ur'ی|یی|ها|های|هایی|هایم|هایت|هایش|هایمان|هایتان|هایشان|', text)

    # for last name

    text = dictationReplace(personNames,
                            ur'ی|یی|زاده|نیا|گان|فر|نژاد|یان|ی\u200cها|یها'
                            , ur'ی|', text)

    # for 'آباد's

    text = dictationReplace(personNames + ur'|' + addToAbad, ur'آباد',
                            ur'زاده|نیا|پور|گان|فر|نژاد|ی|یان|ها|های|یی|هایی|ی\u200cها|یها|'
                            , text)

    # for first names

    for i in firstNameComplex:
        if firstNameComplex.has_key(i):
            text = re.sub(ur'(^|[^' + persianCharacters
                                + ur']|\s|_)(' + i + ur')(\s|_)('
                                + firstNameComplex[i]
                                + ur')(\s|_)($|[^' + persianCharacters
                                + ur']|[' + persianCharacters + ur'])',
                                u'\\1\\2\u200c\\4\\5\\6',text)

    # for colors

    text = dictationReplace(colorsNames, ur'فام|گون', ur'زاده|نیا|پور|گان|فر|نژاد|ی|یی|ها|های|هایی|ی\u200cها|یها|هایم|هایت|هایش|هایمان|هایتان|هایشان|', text)

    # for numbers

    text = dictationReplace(persianNumbers, ur'گانه|ماهه', ur'زاده|نیا|پور|گان|فر|نژاد|ی|یی|ها|های|هایی|هایم|هایت|هایش|هایمان|هایتان|هایشان|', text)

    # wrong dictation

    for i in forReplace:
        if forReplace.has_key(i):
            text = re.sub(ur'(^|[^' + persianCharacters
                                + ur'])(\s|\u200c|_|)(' + i
                                + ur')(\s|\u200c|_|)($|[^'
                                + persianCharacters + ur'])', u'\\1\\2'
                                + forReplace[i] + u'\\4\\5',text)

    # کلماتی که آ دارند

    text = complex_replace(text, ur"(^|\s|_|«|»|\[|\(|\<|\>|\')("+ wordsWithA+ ur")(ی|ئی|یی|ٔ|)( |«|»|\.|،|_|\]|\s|\:|\)|\<|\>|؟|\'|\!|$)", u'\u0627', ur'آ')

    # بن مضارع که آ دارند

    text = complex_replace(text,
                           ur"(^|\u200c|\s|_|«|»|\[|\(|\<|\>|\')("
                           + PresentVerbsWithA
                           + ur")(م|ی|د|یم|ید|ند)( |«|»|\.|،|_|\s|\]|\:|\)|\<|\>|؟|\!|\'|$)"
                           , u'\u0627', ur'آ')

    # بن ماضی که آ دارند

    text = complex_replace(text,
                           ur"(^|\u200c|\s|_|«|»|\[|\(|\<|\>|\')("
                           + PastVerbsWithA
                           + ur")(م|ی|د|یم|ید|ند)( |«|»|\.|،|_|\s|\]|\:|\)|\<|\>|؟|\!|\'|$)"
                           , u'\u0627', ur'آ')

    # همزه ضم

    text = complex_replace(text, ur"(^|\s|_|«|»|\[|\(|\<|\>|\')("
                           + HamzehZam
                           + ur")(‌ها|ها|ین|ان|ی|ئی|یی|ٔ|)( |«|»|\.|،|_|\s|\]|\:|\)|\<|\>|؟|\!|\'|$)"
                           , u'\u0648', ur'ؤ')

    # همزه نصب

    text = complex_replace(text, ur"(^|\s|_|«|»|\[|\(|\<|\>|\')("
                           + HamzehNasb
                           + ur")(ی|ئی|یی|ٔ|)( |«|»|\.|،|_|\s|\]|\:|\)|\<|\>|؟|\!|\'|$)"
                           , u'\u0627', ur'أ')

    # همزه وسط کلمه

    for i in HamzehAtInside:
        if HamzehAtInside.has_key(i):
            text = re.sub(ur"(^|\s|_|«|»|\[|\(|\<|\>|\')(" + i
                                + ur')(| )(' + HamzehAtInside[i]
                                + ur")(?= |«|»|\.|،|_|\s|\]|\:|\)|\<|\>|؟|\!|\'|$)"
                                , u'\\1\\2ء\\4',text)  # در مورد افزودن یا حذف همزهٔ پایانی اجماعی وجود ندارد.

            # الف مقصوره
            text = re.sub(ur"(^|\s|_|«|»|\[|\(|\<|\>|\')(" + HamzehAtEnd + ur")(?= |«|»|\.|،|_|\s|\]|\:|\)|\<|\>|؟|\!|\'|$)",u'\\1\\2ء',text)

            text = complex_replace(text,
                                   ur"(^|\s|_|«|»|\[|\(|\<|\>|\')("
                                   + AlefMaghsooreh
                                   + ur")(| )( |«|»|\.|،|_|\s|\]|\:|\)|\<|\>|؟|\!|\'|$)"
                                   , u'\u0627', ur'ی')

            # صفت+تر

            text = re.sub(ur"(^|\s|_|«|»|\]|\[|\(|\<|\>|\')("
                                + adjective
                                + ur")( |_)تر(?= |«|»|\.|\[|\]|،|_|\s|\:|\)|\<|\>|؟|\!|\'|$)"
                                , u'\\1\\2\u200cتر',text)

            # اسامی رنگ‌ها (به‌عنوان صفت)+تر

            text = re.sub(ur"(^|\s|_|«|»|\]|\[|\(|\<|\>|\')("
                                + colorsNames
                                + ur")( |_)تر(?= |«|»|\.|\[|\]|،|_|\s|\:|\)|\<|\>|؟|\!|\'|$)"
                                , u'\\1\\2\u200cتر',text)

            text = re.sub(ur"به دست\u200cآورد", u'به دست آورد',text)  # Solving a bug!
    def function(s):
        return s.group(1)+s.group(2)[:-1]+u'اً'+s.group(3)
    regex=ur"(^|[؛\s\n\.،«»\'\"\<\>؟])(" + needsNasb + ur')[' + NASB + ZAMM + ur']?([؛؟\s\n\.،«»\'\"\<\>]|$)'
    text=re.sub(regex,function,text, re.UNICODE)
    return text

def normalizeZwnj(text):
    text = re.sub(ur"\u200c{2,}", ur"\u200c",text)

    # Clean ZWNJs after characters that don't conncet to the next letter

    text = \
        re.sub(ur"([۰-۹0-9إأةؤورزژاآدذ،؛,\:«»\\/@#$٪×\*\(\)ـ\-=\|ء])\u200c"
                     , u'\\1',text)

    # Clean ZWNJs before and after English characters

    text = re.sub(ur"\u200c([\w])", u'\\1',text)
    text = re.sub(ur"([\w])\u200c", u'\\1',text)

    # Clean ZWNJs before and after Persian characters

    text = re.sub(ur'\u200c([' + vowels + arabicIndicDigits
                        + persianDigits + hamza + '])', u'\\1',text)
    text = re.sub(ur'([' + arabicIndicDigits + '])\u200c', u'\\1',text)
    text = re.sub(ur"([\w])\u200c", u'\\1',text)

    # Clean ZWNJs after and before punctuation

    text = re.sub(ur"\u200c([ء\n\s\[\]\.،«»\:\(\)\؛\؟\?\;\$\!\@\-\=\+\\|])", u'\\1',text)
    text = re.sub(ur"([\n\s\[\.،«»\:\(\)\؛\؟\?\;\$\!\@\-\=\+\\|])\u200c", u'\\1',text)

    # Clean ZWNJs before brakets which have sapce after\before them

    text = re.sub(ur"\u200c(\][\s\n])", u'\\1',text)
    text = re.sub(ur"([\n\s]\[)\u200c", u'\\1',text)
    return text

def toStandardPersianCharacters(text):
    for i in persianGlyphs:
        text = re.sub(ur'[' + persianGlyphs[i] + ur']', i,text)
    text = normalizeZwnj(text)
    text = text.replace(ur"ك", ur'ک')  # Arabic
    text = text.replace(ur"ڪ", ur'ک')  # Urdu
    text = text.replace(ur"ﻙ", ur'ک')  # Pushtu
    text = text.replace(ur"ﻚ", ur'ک')  # Uyghur
    text = text.replace(ur"ي", ur'ی')  # Arabic
    text = text.replace(ur"ى", ur'ی')  # Urdu
    text = text.replace(ur"ے", ur'ی')  # Urdu
    text = text.replace(ur"ۍ", ur'ی')  # Pushtu
    text = text.replace(ur"ې", ur'ی')  # Uyghur
    text = text.replace(ur"ہ", ur'ه')  # Convert &#x06C1; to &#x0647; ہہہہ to ههه
    text = re.sub(ur"ە", u'ه\u200c',text)  # Kurdish
    text = text.replace(ur"ھ", ur'ه')  # Kurdish
    return text

def applyOrthography(text):
    text = text.replace(ur"\r", ur'')

    # تمیزکاری autoFormatter.js

    text = re.sub(ur"[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F\uFEFF]+", u'',text)
    text = re.sub(ur"[ \xA0\xAD\u1680\u180E\u2000-\u200D\u2028\u2029\u202F\u205F\u2060\u3000]+\n", u'\n',text)

    # تبدیل تب و فاصله نشکن اول خط به هیچ چون مدیاویکی آن را در نظر نمی‌گیرد

    #text = re.sub(ur"\n[\t\u00A0]+", u'\n',text)

    # تبدیل انواع فاصله‌ها به فاصله ساده

    text = re.sub(ur"[\u0020\u0085\u00A0\u180E\u2000-\u200A\u202F\u205F\u3000]", u' ',text)
    text = re.sub(ur"[\u0085]", u'',text)

    # http:#kb.mozillazine.org/Network.IDN.blacklist_chars

    text = re.sub(ur"[\u01C3\uFE15]", u'!',text)
    text = re.sub(ur"[\u02D0\u0589\u05C3\uA789]", u': ',text)
    text = re.sub(ur"[\u0338\u2044\u2215\u2571\u29F8\u3033\uFF0F]", u'/',text)
    text = re.sub(ur"[\u05F4]", u'"',text)
    text = re.sub(ur"[\u06D4\u0701\uFF0E\uFF61]", u'.',text)
    text = re.sub(ur"\u3014", u'(',text)
    text = re.sub(ur"\u3015", u')',text)

    # جایگزینی ۀ غیراستاندار+حرف بعدی بدون فاصله به ه+همزه+فاصله

    text = re.sub(ur"ۀ(?![\s\n])", u'هٔ ',text)

    # Replace ه followed by (space|ZWNJ|lrm) follow by ی with هٔ

    text = re.sub(ur"ه[\u200c\u200e\s]+ی([\s\n])", u'هٔ\\1',text)

    # Replace ه followed by (space|ZWNJ|lrm|nothing) follow by ء or with هٔ

    text = re.sub(ur"ه[\u200c\u200e\s]*[ءٔ]([\s\n])", u'هٔ\\1',text)

    # Replace هٓ or single-character ۀ with the standard هٔ

    text = re.sub(ur"(ۀ|هٓ)", u'هٔ',text)

    # Replace ه followed by ئ or ی, and then by ی, with ه\u200cای, example: خانهئی becomes خانه\u200cای

    text = re.sub(ur"ه\u200c[ئی]ی", u'ه\u200cای',text)

    # def for removing incorrect ZWNJs

    text = re.sub(ur"([\u200c\u200e])([\s\n])", u'\\2',text)
    text = re.sub(ur"([\s\n])([\u200c\u200e])", u'\\1',text)

    # فاصلهٔ پیش از واکه\u200cهای کوتاه اشتباه است و برای جلوگیر از به هم چسبیدن کلمات فاصله و واکه جابجا باید گردند.

    text = re.sub(ur'([' + persianCharacters + vowels + hamza+ ur'])(\s)([' + vowels + hamza + ur'])',u'\\1\\3\\2',text)

    # واکه\u200cهای کوتاه پشت سرهم نمی\u200cآیند و یک حرف باید بینشان فاصله باشد

    text = re.sub(ur'([' + vowels + hamza + ur']){2,}', u'\\1',text)
    text = re.sub(ur"ئء", ur'یء',text)  # two hamzes after each other
    text = re.sub(ur"أء", ur'اء',text)  # two hamzes after each other
    text = re.sub(ur"ؤء", ur'ؤ',text)  # two hamzes after each other

    # .replace(ur"وء", ur'ؤ')#bug on  سوء

    text = re.sub(ur"سؤ ?استفاده", ur'سوءاستفاده',text)  # bug on سوءاستفاده و سوء

    # افزودن همزه

    text = re.sub(ur"درباره (ام|ات|اش|مان|تان|شان|ای)(\s|$)",u'درباره‌\\1\\2',text)  # i برای جلوگیری از باگ احتمالی برای افزودن همزه به درباره
    #text = re.sub(ur"درباره\s", ur'دربارهٔ ',text)
    #text = re.sub(ur'صفحه(\s|)([' + persianDigits + ']+)(\n|\.|\,|\||\<)', u'صفحهٔ \\2\\3',text)  # [[Special:PermaLink/15326391#افزودن همزه]]
    return text

def complexVerbsApplyZwnj(text):
    for x in persianComplexPastVerbs:
        y = persianComplexPastVerbs[x]
        text = re.sub(ur'(^|[^' + persianCharacters + ur'])(' + x
                            + ur') ?(می|نمی|)( |\u200c|)(ن|)(' + y
                            + ur')(م|ی|یم|ید|ند|ه|ن|)($|[^'
                            + persianCharacters + ur'])',
                            u'\\1\\2\u200c\\3\u200c\\5\\6\\7\\8',text)

    for x in persianComplexPresentVerbs:
        y = persianComplexPresentVerbs[x]
        text = re.sub(ur'(^|[^' + persianCharacters + ur'])(' + x
                            + ur') ?(می|نمی|)( |\u200c|)(ن|)(' + y
                            + ur')(م|ی|د|یم|ید|ند|ن)($|[^'
                            + persianCharacters + ur'])',
                            u'\\1\\2\u200c\\3\u200c\\5\\6\\7\\8',text)

    return text

def applyZwnj(text):
    text = re.sub(ur'(^|[^' + persianCharacters + ur'])(می|نمی) ?'
                        + persianPastVerbs + ur'(م|ی|یم|ید|ند|ه|)($|[^'
                        + persianCharacters + u'])', u'\\1\\2\u200c\\3\\4\\5',text
                        )
    text = re.sub(ur'(^|[^' + persianCharacters + ur'])(می|نمی) ?'
                        + persianPresentVerbs
                        + ur'(م|ی|د|یم|ید|ند)($|[^' + persianCharacters
                        + ur'])', u'\\1\\2\u200c\\3\\4\\5',text)

    # بن فعل مضارع «دان» جدا آمد چون پسوند «ی» با عبارت «میدانی» تداخل داشت

    text = re.sub(ur'(^|[^' + persianCharacters
                        + ur'])(می|نمی) ?(دان)(م|د|یم|ید|ند)($|[^'
                        + persianCharacters + ur'])', u'\\1\\2\u200c\\3\\4\\5',text
                        )

    # ماضی نقلی
    text = re.sub(ur'(^|[^' + persianCharacters + '])' + persianPastVerbs +
                    ur'ه (ام|ای|ایم|اید|اند|است)($|[^' + persianCharacters + ur'])',
                    u'\\1\\2ه\u200c\\3\\4', text
                    )


    # ای «توان» ناقلا!

    text = re.sub(ur"(\s)(می|نمی) ?توان", u'\\1\\2\u200cتوان',text)

    # چسباندن تمام «ها»ها با فاصلهٔ مجازی

    text = re.sub(ur" ها([\]\.،\:»\)\s]|\'{2,3}|\={2,})",u'\u200cها\\1',text)
    text = re.sub(ur" ها(ی|یی|یم|یت|یش|مان|تان|شان)([\]\.،\:»\)\s])", u'\u200cها\\1\\2',text)
    text = re.sub(ur"هها", u'ه‌ها',text)

    # چسباندن تمام «ترین»ها با فاصلهٔ مجازی

    text = re.sub(ur" ترین([\]\.،\:»\)\s]|\'{2,3}|\={2,})",u'\u200cترین\\1',text)

    # برای حذف علامت ستاره اضافی قبل از عنوان ها

    text = re.sub(ur"\n\*\s*(\=+.+?\=+\n)", u'\n\\1',text)

    # عضو علامت های نقل قول تکی از عنوان ها

    text = re.sub(ur"(\n=+)(.*?)(?:'+)(.*?)(?:'+)(.*?)(=+\n)", u'\\1\\2\\3\\4\\5',text)

    # اول و آخر هم خط اگر فاصلهٔ مجازی باشد، حذف شود

    text = re.sub(ur"(^\u200c|\u200c$)", u'',text)

    # شناسه ها
    # توجه: «است» تعدماً از شناسه ها حذف شده چون به عنوان فعل مستقل هم کاربرد دارد و در آن موارد باید جدا نوشته شود
    # مثال: «این یک خانه است» که است در آن باید از خانه جدا نوشته شود

    text = re.sub(ur'ه +(ایم|اید|اند)($|[^' + persianCharacters + ur'\u200c])', u'ه\u200c\\1\\2',text)

    # موارد جزئی دیگر و بی ربط به فاصلهٔ مجازی، باید منتقل شود

    text = re.sub(ur"ا\sً", u'اً',text)

    # رفع اشکال که\u200cای

    text = re.sub(ur" که\u200cای ", u' که ای ',text)

    # رفع اشکال میستری (Mystery)

    text = re.sub(ur"می\u200cستری", u'میستری',text)
    text = re.sub(ur'می\u200cگوی($|[^' + persianCharacters
                        + ur'\u200c])', u'میگوی\\1',text)  # for میگوی دریایی
    text = re.sub(ur'می\u200cدوی($|[^' + persianCharacters
                        + ur'\u200c])', u'میدوی\\1',text)  # for [[میدوی (ابهام‌زدایی)]]
    return text

def punctuation(text):
    # / سجاوندی غیرفارسی

    text = re.sub(ur"ː", u': ',text)  # Replace incorrect : character

    # استفاده از ؟ فارسی

    text = re.sub(ur'([' + persianCharacters + ur'])[ ]*[?]',u'\\1؟',text)

    # استفاده از ; فارسی

    text = re.sub(ur'([' + persianCharacters + ur'])[ ]*[;]',u'\\1؛ ',text)

    # استفاده از ، فارسی

    text = re.sub(ur'([' + persianCharacters + ur'])(\]\]|»|)[ ]*[,]', u'\\1\\2، ',text)
    #اصلاح ویرگول فارسی به انگلیسی در میان کلمات انگلیسی
    text = re.sub(ur'([a-zA-Z])+ *،', u'\\1,',text)

    # حذف دو فاصله بعد از سجاوندی

    text = re.sub(ur"(،|؛|؟|\.)  ", u'\\1 ',text)
    text = re.sub(ur"\r", u'',text)

    # افزودن یا حذف فاصله
    # حذف فاصله‌های تکراری میان واژه‌ها، به جز بین نام پارامتر و علامت مساوی

    text = re.sub(ur"(. ) +(?=[^= ])", u'\\1',text)

    # فاصله بعد از سجاوندی به جز ! به دلیل (<!-- و !! در بالای جدول‌ها)

    text = \
        re.sub(ur"([،\.\؛\؟»])([^\s\.\(\)«»\"\[\]<>\d\w\{\}\|۰۱۲۳۴۵۶۷۸۹\'])"
                     , u'\\1 \\2',text)

    # افزودن فاصله به بعد از سجاوندی

    text = re.sub(ur'([' + persianCharacters
                        + ur']+|\]|\)|»)([؟،؛\!\.])(['
                        + persianCharacters + persianDigits
                        + ur']+|\[|\(|«)', u'\\1\\2 \\3',text)

    # حذف فاصله بعد از گیومه، پرانتز، براکت باز

    text = re.sub(ur"([\(«\[]) ", u'\\1',text)

    # حذف فاصله قبل از گیومه، پرانتز، براکت بسته

    text = re.sub(ur" ([\)»\]])", u'\\1',text)

    # افزودن فاصله قبل از گیومه باز

    text = re.sub(ur"([^ \(\[\|\r\n>'])(«)", u'\\1 \\2',text)
    text = re.sub(ur" +\( +", u' (',text)
    text = re.sub(ur'([' + persianCharacters
                        + ur']|\]|») *\( *(?=[' + persianCharacters
                        + ur'])(?!ها\)|ان\))', u'\\1 (',text)
    text = re.sub(ur'([' + persianCharacters + ur']) *\) *(?=['
                        + persianCharacters + ur']|\[|«)', u'\\1) ',text)

    # Removes extra line between two items list

    text = re.sub(ur"(\n\*.*?)\n+(?=\n\*)", u'\\1',text)

    # Removes extra line between two items list

    text = re.sub(ur"(\n#.*?)\n+(?=\n#)", u'\\1',text)

    # Convert , to ، if there are Persian characters on both sides of it

    text = re.sub(ur'([' + persianCharacters + ur']), ?(?=['
                        + persianCharacters + ur'])', u'\\1\\2، ',text)

    # بعد از نقطه‌ویرگول فارسی علامتی قرار نمی‌گیرد

    text = re.sub(ur"(؛)(([\s]+)?[\.،؛:!؟\-…])", u'\\1',text)

    # در انتهای پاراگراف نقطه‌ویرگول فارسی نمی‌آید

    text = re.sub(ur"(؛)(\s|)\n", u'.\n',text)

    # سجاوندی در ابتدای علامت باز قرار نمی‌گیرد

    text = re.sub(ur"([\(«])[\s]([؛\.،])", ur'\\1',text)

    # ویرگول فارسی
    # بعد از ویرگول فارسی این علامت‌ها قرار نمی‌گیرد

    text = re.sub(ur"(،)([\s]+)?([،؛!؟\-][\.،؛!؟\-]*|\.(?!\.))",
                        u'\\1',text)

    # نقطه
    # باید سه نقطه باشد

    text = re.sub(ur'([' + persianCharacters + ur'])( *)(\.{3,})'
                        , u'\\1\\2…',text)
    text = re.sub(ur" \.\.\. ", ur' … ',text)

    # بعد از نقطه این علایم نمی‌آیند

    text = re.sub(ur'([' + persianCharacters
                        + ur'])\.( *[،؛:!؟\?]+)', u'\\1.',text)

    # سجاوندی در ابتدای پرانتز و گیومه باز قرار نمی‌گیرد

    text = re.sub(ur'(\(|«)[\.،؛](\s|)([' + persianCharacters
                        + ur'])', u'\\1\\3',text)

    # سجاوندی در داخل پرانتز

    text = re.sub(ur'([' + persianCharacters
                        + ur'])(\s|)[\.،؛](\s|)(\))', u'\\1\\2\\3\\4',text)

    # در صورت وابستگی معنی جملات بهتر است نقطه‌ویرگول فارسی قرار گیرد

    text = re.sub(ur'([' + persianCharacters
                        + ur'])(\s|)(\.)(\s|)(ولی|که\s|و\s|بنابراین|لذا)'
                        , u'\\1؛ \\5',text)

    # / Question & exclamation mark
    # علامت تعجب تکراری به دلیل وجود !! در عنوان جدول‌های مدیاویکی نباید اصلاح شود.
    # تكرار علامت سوال فارسی

    text = re.sub(ur"(؟(\s|)){2,}", u'؟',text)

    # علامت‌گذاری نادرست

    text = text.replace(ur'؟ !', ur'؟!').replace(ur'! ؟', u'!؟')

    # Remove space preceding punctuation, except for ellipses

    text = re.sub(ur"([^ \.]) +([؟،\:؛!\.])(\s[^ \.]|<|$)",
                        u'\\1\\2\\3',text)
    # عبارت «ها» درون پرانتز می‌تواند به کلمه قبلی خود بچسبد
    text = re.sub(ur' \(ها\)', u'(ها)',text)
    text = re.sub(ur'ه‍\. (ق|خ|ش)([\n ])', u'ه‍.\\1\\2',text) #iاصلاح تاریخ هجری
    # حذف فاصلهٔ میان دو عبارت مختصر که دارای نقطهٔ اختصار باشند
    myregex = re.compile(ur'(?:[' + persianCharacters + ur']{1,2}\. ?){2,6}')
    lists=re.findall(myregex,text)
    if lists:
        for item in lists:
            item2= re.sub(ur'\. (.)', u'.\\1',item)
            if item!=item2:
                text = text.replace(item,item2)
    return text

def runAbarAbzar (text):
    text = normalizeZwnj (text)
    text = quotation (text)
    text = dictation (text)
    text = toStandardPersianCharacters (text)
    text = applyOrthography (text)
    text = complexVerbsApplyZwnj (text)
    text = applyZwnj (text)
    text = punctuation (text)
    text = normalizeZwnj (text)
    return text

def minor_edits (text):
    #تمیزکاری فاصلهٔ مجازی    
    text = re.sub(u'‌{2,}', u'‌', text) # پشت‌سرهم
    text = re.sub(u'\[\[([^\]\|]*?)‌]](%s+)' % faChrs, ur'[[\1|\1‌\2]]', text) # Piping
    text = re.sub(u'‌(?![ئاآأإژزرذدوؤةب\(\)پتثجچحخسشصضطظعغفقک،گلمنهیيًٌٍَُِّْٰ\[\]ٓٔ]|[\u0900-\u097F]|ֹ)', '', text) # در پس
    text = re.sub(u'(?<![ئبپتثجچح\[\]خسشصضطظعغ\(\)فقکگلم،نهیيًٌٍَُِّْٰٓٔ]|[\u0900-\u097F]|f|ֹ)‌', '', text) # در پیش
    return text
 
def arabic_to_farsi(text):
    text = re.sub(u'[كﮑﮐﮏﮎﻜﻛﻚﻙ]', u'ک', text)
    text = re.sub(ur'[ىىىېىﻴﻲﻳﻲۍﻱﻰىىﻯي]', u'ی', text)
    text = re.sub(ur'[ہەھ]', u'ه', text)
    text = re.sub(ur'[َُِّْٰ]', u'', text)#ur'[\u064E\u064F\u0650\u0651\u0652\u0670]'
    count=-1
    fanum=u"۰۱۲۳۴۵۶۷۸۹"
    arnum=u"٠١٢٣٤٥٦٧٨٩"
    for i in arnum:    
        count+=1
        text=text.replace(arnum[count],fanum[count])
 
    return text
 
def dictation(txt):
    #s: شبه‌ساده‌ها  ####### مشارٌ‌اليه، مضاف‌ٌاليه، منقولٌ‌عنه، مختلفٌ‌فيه، متفق‌ٌعليه، بعبارةٍاُخرى، اباًعن‌جدٍ، اىّ‌نحوٍكان.
    txt = re.sub(bLB+u'من ?(باب|جمله)'+bLA, ur'من‌\1', txt)
    txt = re.sub(u' مع ?(هذا|ذلک|الفار[غق]|الوصف|ال[اأ]سف)', ur' مع‌\1', txt)
    txt = re.sub(u' علی ?(هذا|حده|رغم|الاصول|الحساب|الخصوص|البدل|الدوام|السویه|الطلوع|الله|القاعده)', ur' علی‌\1', txt)
    txt = re.sub(bLB+u' ذو ال', u' ذوال', txt)
    txt = re.sub(u' ذی ?(ال|نفع|امر|جود|حساب|حق|حیات|ربط|روح|شعور|صلاحیّ?ت|عقل|علاقه|فقار|فن|قیمت|نفوذ)'+bLA, ur' ذی‌\1', txt)
    txt = re.sub(bLB+u' حقّ? (?=البوق|العبور|الت[اأ]لیف|التدریس|الزحمه|اللّ?ه|النّ?اس|تعالی)', u' حق‌', txt)
    txt = re.sub(u' عن ?[قغ]ریب', u' عن‌قریب', txt)
    txt = re.sub(u' قتل ?عام', u' قتل‌عام', txt)
    txt = re.sub(u' علی[‌ ][اأ]یّ?[‌ ]?حال', u' علی‌أی‌حال', txt)
    txt = re.sub(u' من[‌ ]?حیث[‌ ]?المجموع', u' من‌حیث‌المجموع', txt)
    txt = re.sub(u'ب(?:|ه[‌ ])ر[اأ]ی[‌ ]العین', u'برأی‌العین', txt)
    txt = re.sub(u'ما ?ب(?:|ه[‌ ])ازا', u'مابازا', txt)
    txt = re.sub(u'متقابل[‌ ](?:ب|به[‌ ])ر[اأ]س', u'متقابل‌به‌رأس', txt)
    txt = re.sub(u'منحصر ?(?:ب|به[‌ ])فرد', u'منحصربه‌فرد', txt)
    txt = re.sub(bLB+u'فی[‌ ]?ما ?بین', u'فی‌مابین', txt)
    txt = re.sub(u' [اآ]ی[ةت][‌ ]?اللّ?ه', u' آیت‌الله', txt)#عنایت‌الله
    txt = re.sub(u'حج[ةته][‌ ]?ال[اإ]سلام', u'حجت‌الاسلام', txt)
    txt = re.sub(u'ثق[ةته][‌ ]?ال[اإ]سلام', u'ثقةالاسلام', txt)
    txt = re.sub(u'امیر ?الم[وؤ]منین', u'امیرالمؤمنین', txt)
    txt = re.sub(u'(متوازی|مختلف)[‌ ]?ال[اأ]ضلاع', ur'\1‌الأضلاع', txt)
    txt = re.sub(u'متساوی[‌ ]?السّ?اقین', u'متساوی‌الساقین', txt)
    txt = re.sub(u'قا[یئ]م[‌ ]الزّاوی[ةه]', u'قائم‌الزاویه', txt)
    txt = re.sub(u'دا[یئ]ر[ةته][‌ ]?(البروج|المعارف|العلوم)', ur'دائرة\1', txt)
    txt = re.sub(u'دا[یئ]م[‌ ](الخمر|الصوم|الذّ?[کك]ر)', ur'دائم‌\1', txt)
    txt = re.sub(u'ر[اأإ]س[‌ ](الجدی|السّ?رطان|المال)', ur'رأس‌\1', txt)
    txt = re.sub(u'(مجنی|مجنی)[‌ ][عا]لیه', ur'\1‌علیه', txt)
    txt = re.sub(u'(مضاف|مسند|مرجوع|مشار|منتقل)ٌ?[‌ ]?[عا]لیه', ur'\1ٌ‌الیه', txt)
    txt = re.sub(u'منته[ای][‌ ]?[عا]لیه', u'منتهی‌الیه', txt)
    txt = txt.replace(u'بین الملل', u'بین‌الملل').replace(u'نرم افزار', u'نرم‌افزار').replace(u'حزب الل', u'حزب‌الل')
    txt = txt.replace(u'جدید الاحداث', u'جدیدالاحداث').replace(u'کثیر الانتشار', u'کثیرالانتشار').replace(u'سریع السیر', u'سریع‌السیر')
    txt = txt.replace(u'لازم الاجرا', u'لازم‌الاجرا').replace(u'فوق الذکر', u'فوق‌الذکر').replace(u'مرضی الطرف', u'مرضی‌الطرف')
    txt = txt.replace(u'خاتم الانبیا', u'خاتم‌الانبیا').replace(u'متفق القول', u'متفق‌القول').replace(u'قریب الوقوع', u'قریب‌الوقوع')
    txt = txt.replace(u'سوق الجیشی', u'سوق‌الجیشی').replace(u'محیر العق', u'محیرالعق').replace(u'عظیم الجث', u'عظیم‌الجث')
    txt = txt.replace(u'لطایف الحیل', u'لطایف‌الحیل').replace(u'موقوف المعانی', u'موقوف‌المعانی').replace(u'سلیم النفس', u'سلیم‌النفس')
    txt = txt.replace(u'موثق الصدور', u'موثق‌الصدور').replace(u'شمس العمار', u'شمس‌العمار').replace(u'حسب الامر', u'حسب‌الامر')
    txt = txt.replace(u'مسلوب الاراده', u'مسلوب‌الاراده').replace(u'مستجاب الدعو', u'مستجاب‌الدعو')
    txt = re.sub(bLB+u'(دار|مشترک|ممنوع|قدیم|قلیل|ناقص|ضعیف|قوی|تحت|ر[یئ]یس|ربّ?|امّ?|حقّ?|ماء|ماوراء|باب) (?=ال)', ur'\1‌', txt)
   #txt = re.sub(u'‌(?=الهام|الصاق|الزام|القا|الکتریک|الکتریسیته)', u'', txt)
    txt = txt.replace(u'برپایه', u'بر پایه')
    txt = txt.replace(u'سیستم عامل', u'سیستم‌عامل')
    #e: آ
    #txt = re.sub(bLB+u'(ا|أ)('+noAlef+u')'+bLA, ur"آ\2", txt)#it has some bugs!
    txt = txt.replace(u' راکتور', u' رآکتور').replace(u'فرآیند', u'فرایند')#.replace(u'فرآورده', u'فراورده')# e: ا <-> آ
    txt = re.sub(bLB+u'ایده?[‌ ][اآ]ل', u'ایده‌آل', txt)
    #s: افعال
    txt = txt.replace(u' دو میدانی ', u' دومیدانی ')
    txt = re.sub(bLB+u'(نمی) ?([نب]ی؟|)('+bnMzare+u'|'+bnMazi+u')(ان|)(م|ی|د|یم|ید|ا?ند)'+bLA, ur'\1‌\2\3\4\5', txt) # می bug همیاری
    #txt = re.sub(bLB+u'(باز|فر[او]|وا|[بد]ر) ?([هن]?می‌|)([منب]ی?|)('+bnMzare+u'|'+bnMazi+u')(م|ی|د|یم|ید|ا?ند)'+bLA, ur'\1\2\3\4\5', txt) # پیشوند فعل ### BUG
    txt = re.sub(bLB+u'(باز|فر[او]|وا|بر) ?([منب]ی?|)('+bnMazi+u')ن'+bLA, ur'\1\2\3ن', txt)#وی در جنگیدن با من
    txt = re.sub(bLB+u'('+bnMazi+u')ه (ام|ای|ایم|اید|اند)'+bLA, ur'\1ه‌\2', txt) # فم بین «ه» و شناسه طبق شیوه‌نامه است باید جدا باشد
    txt = re.sub(u'([منب])یا(رزید|فتاد|فتد|فراشت|فروخت|فزود|فسرد|فشاند|ف[کگ]ند|نجامید|ند[او]خت|ندیشید|ن[بگ]اشت|نگیخت)(م|ی|یم|ید|ند|[^'+faChrs+u'])', ur'\1ی\2', txt) # نیافتاد -> نیفتاد
    txt = re.sub(u'([منب])یا(رز|فر[او]ز|فزای|فسر|فشان|ف[کگ]ن|نبار|نجام|ندا[یز]|ندوز|ندیش|نگار|نگیز)(م|ی|د|یم|ید|ا?ند|[^'+faChrs+u'])', ur'\1ی\2\3', txt) # بیاندیش -> بیندیش
 
    #s: ضمایر ملکی
    txt = re.sub(u'(?:ه|هٔ)[‌ ](مان|شان)'+bLA, ur'ه‌\1', txt)#BUG:Solved
    txt = re.sub(u'(?<=ه)[‌ ](ات|اش)'+bLA, ur'‌\1', txt)
 
    #s: و
    txt = re.sub(u'رفت[‌ ]?و ?[اآ]مد', u'رفت‌وآمد', txt)
    txt = re.sub(u'گفت[‌ ]?و ?گو', u'گفتگو', txt)
    txt = re.sub(u'جست[‌ ]?و ?جو', u'جستجو', txt)
    txt = re.sub(u'پخت[‌ ]?و ?پز', u'پخت‌وپز', txt)
    txt = re.sub(u'شست[‌ ]?و ?شو', u'شست‌وشو', txt)
    txt = re.sub(u'خفت[‌ ]?و ?خیز', u'خفت‌وخیز', txt)
    txt = re.sub(bLB+u'کند ?و ?کا?و'+bLA, u'کندوکاو', txt)
    txt = re.sub(bLB+u'کم[‌ ]و ?کاست', u'کم‌وکاست', txt)
 
    #s: بسیط
    txt = re.sub(u'(فن|دل)ّ?[‌ ]?[آا]وری', ur'\1اوری', txt)    
    txt = re.sub(bLB+u' دل[‌ ](سوزی|تنگی|بری) '+bLA, ur' دل\1 ', txt)#Bug دل بریدن
    txt = re.sub(bLB+u'یک[‌ ]دلی'+bLA, u'یکدلی', txt)
    txt = re.sub(u'گاه[‌ ]و ?بی[‌ ]?گاه', u'گاه‌و‌بیگاه', txt)
 
    #e: دیگر غلط‌های املایی
    txt = re.sub(u' (سپاس|شکر|بر)[‌ ]?گ[ذز]ار ', ur' \1‌گزار ', txt)#بنا بر گزارش
    txt = re.sub(u'(پایه|بنیان)[‌ ]?گزار', ur'\1‌گذار', txt)#متغییر الگو بنیانگذار
    txt = re.sub(bLB+u'بی[‌ ]?م[حه]ابا', u'بی‌محابا', txt)
    txt = re.sub(bLB+u' بر ?خو?است', u' برخاست', txt)
    txt = re.sub(u'خوانواد(?=ه|گی)', u'خانواد', txt)
    txt = re.sub(u'[آا]نفو?لو? ?[آا]نزا', u'آنفلوانزا', txt)
    txt = re.sub(bLB+u'غری[ضظ]ه'+bLA, u'غریزه', txt)
    txt = txt.replace(u'خواستگاه', u'خاستگاه')
    txt = txt.replace(u'باطری', u'باتری').replace(u'باطلاق', u'باتلاق').replace(u' ملیون', u' میلیون')
    txt = txt.replace(u'ضمینه', u'زمینه').replace(u'انظباط', u'انضباط').replace(u'حاظر', u'حاضر')
    #txt = txt.replace(u'نفوظ', u'نفوذ') ###
    txt = txt.replace(u'مذبور', u'مزبور').replace(u'قائله', u'غائله').replace(u' وحله', u' وهله').replace(u' مرهمت', u' مرحمت')    
    txt = txt.replace(u' انهنا', u' انحنا').replace(u'پزشگی', u'پزشکی').replace(u'تضاهرات', u'تظاهرات')
    txt = txt.replace(u'تلوزیون', u'تلویزیون').replace(u'پرفسور', u'پروفسور').replace(u' خوشنود', u' خشنود')
    txt = txt.replace(u' الویت', u' اولویت').replace(u'ملیارد', u'میلیارد')
    txt = txt.replace(u'شگفت انگیز', u'شگفت‌انگیز')
    txt = re.sub(u'ه‌(گی|گانی?)'+bLA, ur'\1', txt)
    #txt = re.sub(bLB+u'وب[‌ ]?(سایت|گاه)', u'وبگاه', txt) ###in many cases it could be template vaiable!
    txt = re.sub(u'ویکی ?(?=سازی|فا |[مپ]دیا)', u'ویکی‌', txt)
    txt = re.sub(u'ویکی‌پدیا ?(?='+langs+u')', u'ویکی‌پدیای ', txt)
    txt = re.sub(u'علاقه?[‌ ]?مند', u'علاقه‌مند', txt)
    txt = re.sub(u'باقی ?ماند', u'باقی‌ماند', txt)
    txt = re.sub(u'مت[عاأ][سص]ّ?فانه', u'متأسفانه', txt)
    txt = re.sub(u'آندروید', u'اندروید', txt)

    txt = re.sub(bLB+u'من[‌ ]را'+bLA, u'مرا', txt)
    #txt = re.sub(u'عدم وجود'+bLA, u'نبودِ', txt)
    #txt = txt.replace(u'عدم حضور', u'غیاب')
    txt = re.sub(u'اقدامات لازمه?'+bLA, u'اقدام‌های لازم', txt)
 
    #e: ماه‌ها
    txt = re.sub(bLB+u'(?:جولای|ژوییه)'+bLA, u'ژوئیه', txt)
    #txt = re.sub(bLB+u'[اآ]گوست'+bLA, u'اوت', txt)#جین آگوست دومینیک
    txt = re.sub(bLB+u'دی?سا?مبر'+bLA, u'دسامبر', txt)
    txt = re.sub(u'(ربیع|جمادی)[‌ ]?(?:الثانی|ال[اأإ]خر)', ur'\1‌الثانی', txt)
    txt = re.sub(u'(ربیع|جمادی)[‌ ]?ال[اأإ]ول', ur'\1‌الاول', txt)
    #txt = re.sub(u'ذ[وی][‌ ]?(?:ال|)(حج|قعد)[ةه]', ur'ذی‌ال\1ه', txt) ###
 
    #e: جمع‌الجمع
    txt = re.sub(u'(مدارک)[‌ ]?های?'+bLA, u'مدارک', txt)
    txt = re.sub(bLB+u'رسومات'+bLA, u'رسوم', txt)
 
 
    #e: حشو
    txt = re.sub(bLB+u'بر ?علیه', u'علیه', txt) # بر علیه
    txt = re.sub(u'اعلم[‌ ]?تر', u'اعلم', txt) # تر
 
    #e: طبق قاعدهٔ فارسی
    txt = re.sub(u'(آزمایش|پژوهش|پیشنهاد|نمایش|دستور|فرمایش|گزارش|گرایش|باغ|کوهستان)اتی ', ur'\1‌هایی ', txt) # اتی -> هایی
    txt = txt.replace(u'بازرسین', u'بازرسان').replace(u'داوطلبین', u'داوطلبان') #e: ین -> ان
    txt = txt.replace(u'زباناً', u'زبانی').replace(u'تلفناً', u'تلفنی').replace(u'ناچاراً', u'به‌ناچار').replace(u'گاهاً', u'گاهی') #e: اً
    #--------------------------Reza added------------------------
    return txt.strip()
 
def cleaning(text):           
    text=text.replace(u'\r',u'').replace(u'\n^ "',u'\n*"').replace(u'&zwnj;',u'‌').replace(u'\n \n \n',u'\n\n').replace(u'\n \n',u'\n\n').replace(u'\n \n',u'\n\n').replace(u'\n  \n',u'\n\n')
    text=text.replace(u'< ',u'<').replace(u' >',u'>').replace(u'<!--\n',u'<!--').replace(u'\n-->',u'-->').replace(u'<!---\n',u'<!---').replace(u'\n--->',u'--->')
    #تمیزکاری فاصلهٔ مجازی    
    text = re.sub(u'‌{2,}', u'‌', text) # پشت‌سرهم
    text = re.sub(u'\[\[([^\]\|]*?)‌]](%s+)' % faChrs, ur'[[\1|\1‌\2]]', text) # Piping
    text = re.sub(u'‌(?![ئاآأإژزرذدوؤةبپتثجچحخسشصضطظعغفقکگلمنهیيًٌٍَُِّْٰٓٔ]|[\u0900-\u097F]|ֹ)', '', text) # در پس
    text = re.sub(u'(?<![ئبپتثجچحخسشصضطظعغفقکگلمنهیيًٌٍَُِّْٰٓٔ]|[\u0900-\u097F]|f|ֹ)‌', '', text) # در پیش
    text=arabic_to_farsi(text)
    text=minor_edits (text)
    text = re.sub(u"(?:"+zaed+u")", "", text)
    return text

def add_tanvin(text):
    def function(s):
        return s.group(1)+s.group(2)[:-1]+u'اً'+s.group(3)
    regex=ur"(^|[؛\s\n\.،«»\'\"\<\>؟])(" + needsNasb + ur')[' + NASB + ZAMM + ur']?([؛؟\s\n\.،«»\'\"\<\>]|$)'
    text=re.sub(regex,function,text, re.UNICODE)
    return text

def main(ns,correectList):
    os.system('sql fawiki_p "SELECT page_title FROM page WHERE page_namespace = '+ns+' AND page_is_redirect = 0;" > '+bot_adress+'Title_sql_result.txt')
    text = codecs.open( bot_adress+'Title_sql_result.txt','r' ,'utf8' )
    text = text.read().replace(u'_',u' ').replace(u'\r',u'').replace(u'\n\n',u'\n').strip()#.replace(u'\n',u'\n\nااا\n\n').strip()
    pywikibot.output(u'\03{lightblue}-- Sql is done!\03{default}')
    our_list={}    
    new_txt2,new_txt3,new_txt4,new_txt5,new_txt6,new_txt7,new_txt=u'\n',u'\n',u'\n',u'\n',u'\n',u'\n',u'\n'
    text2=text
    text2=dictation(text2)
    text2=cleaning(text2)
    text2=text2.replace(u',',u'،').replace(u' ،',u'،').replace(u' ؛',u'؛')
    text2=text2.replace(u'  ',u' ').replace(u'  ',u' ').strip()
    text2=runAbarAbzar(text2).strip()
    text2=text2.replace(u'ٔ',u'')#remove hamzeh
    text2=add_tanvin(text2)
    with codecs.open(bot_adress+u"zztxt1.txt" ,mode = 'w',encoding = 'utf8' ) as f:
        f.write(text)
    with codecs.open(bot_adress+u"zztxt1+abarabzar.txt" ,mode = 'w',encoding = 'utf8' ) as f:
        f.write(text2)
    pywikibot.output(u'\03{lightblue}-- compairing the lists\03{default}')
    #list2=text2.replace(u'\nااا\n',u'\n').replace(u'\n\n',u'\n').replace(u'\n\n',u'\n').strip().split(u'\n')
    #list1=text.replace(u'\nااا\n',u'\n').replace(u'\n\n',u'\n').replace(u'\n\n',u'\n').strip().split(u'\n')
    list2=text2.replace(u'\n\n',u'\n').replace(u'\n\n',u'\n').strip().split(u'\n')
    list1=text.replace(u'\n\n',u'\n').replace(u'\n\n',u'\n').strip().split(u'\n')
    count1=-1
    for txt in list1:
        count1+=1
        pywikibot.output( u'='+str(count1))
        if list2[count1]!=txt:
            if list1[count1] in correectList:
                continue
            elif u'ویکی‌پدیا:گزیدن نگاره برگزیده' in txt :
                continue
            elif u'–' in list2[count1] or u'. ' in list2[count1]:
               new_txt2+=u'# [['+txt +u']]\t > \t[['+list2[count1]+u']]\n'
            elif u'هٔ' in txt or u'ه‌ی ' in txt:#همزه
               new_txt7+=u'# [['+txt +u']]\t > \t[['+list2[count1]+u']]\n'
            elif u',' in txt and u'،' in list2[count1]:
               new_txt6+=u'# [['+txt +u']]\t > \t[['+list2[count1]+u']]\n'
            elif string.count(list2[count1],u'آ')> string.count(txt,u'آ'):
               new_txt3+=u'# [['+txt +u']]\t > \t[['+list2[count1]+u']]\n'
            elif u'ها' in list2[count1] and u' ها' in txt:
               new_txt4+=u'# [['+txt +u']]\t > \t[['+list2[count1]+u']]\n'
            elif u'ي' in list2[count1] or u' ك' in txt:
               new_txt5+=u'# [['+txt +u']]\t > \t[['+list2[count1]+u']]\n'
            else:
                new_txt+=u'# [['+txt +u']]\t > \t[['+list2[count1]+u']]\n'
                
    if ns=='0':
        saveAdress=u'ویکی‌پدیا:گزارش دیتابیس/برای انتقال مقاله'
    elif ns=='14':
        saveAdress=u'ویکی‌پدیا:گزارش دیتابیس/برای انتقال رده'
    elif ns=='10':
        saveAdress=u'ویکی‌پدیا:گزارش دیتابیس/برای انتقال الگو'
    elif ns=='4':
        saveAdress=u'ویکی‌پدیا:گزارش دیتابیس/برای انتقال ویکی‌پدیا'
    elif ns=='12':
        saveAdress=u'ویکی‌پدیا:گزارش دیتابیس/برای انتقال راهنما'
    else:
        pass

    fapage=pywikibot.Page(faSite,saveAdress)
    put_text=u'{{گزارش دیتابیس/صفحه برای انتقال}}\n== سجاوندی ==\n'+new_txt2+u'\n\n== ویرگول ==\n'+new_txt6+u'\n\n== همزه ==\n'+new_txt7+u'\n\n== آ ==\n'+new_txt3+u'\n\n== ها ==\n'+new_txt4+u'\n\n== ي-ك عربی ==\n'+new_txt5+u'\n\n== سایر ==\n'+new_txt+u'\n'
    if ns=='14':
        put_text=put_text.replace(u'[[',u'[[:رده:')
    elif ns=='10':
        put_text=put_text.replace(u'[[',u'[[الگو:')
    elif ns=='4':
        put_text=put_text.replace(u'[[',u'[[ویکی‌پدیا:')
    elif ns=='12':
        put_text=put_text.replace(u'[[',u'[[راهنما:')
    else:
        pass
    fapage.put(put_text,u'ربات:به‌روزرسانی گزارش')
    fapage=pywikibot.Page(faSite,saveAdress+u'/امضا')
    fapage.put(put_text,u'ربات:به‌روزرسانی گزارش')
    new_txt2,new_txt3,new_txt4,new_txt5,new_txt6,new_txt7,new_txt=u'\n',u'\n',u'\n',u'\n',u'\n',u'\n',u'\n'

def get_whiteList(saveAdress):
    correct_page=pywikibot.Page(faSite,saveAdress+u'/فهرست سفید')
    correctLinks=correct_page.get()
    correctLinks=correctLinks.replace(u'\r',u'')
    correectList=[]
    for i in correctLinks.split(u'\n*'):
        correectList.append(i.strip())
    return correectList


def run():
    correectList=get_whiteList (u'ویکی‌پدیا:گزارش دیتابیس/برای انتقال مقاله')
    print "Starting NS 0"
    main('0',correectList)

    correectList=get_whiteList (u'ویکی‌پدیا:گزارش دیتابیس/برای انتقال رده')
    print "Starting NS 14"
    main('14',correectList)

    correectList=get_whiteList (u'ویکی‌پدیا:گزارش دیتابیس/برای انتقال الگو')
    print "Starting NS 10"
    main('10',correectList)

    correectList=get_whiteList (u'ویکی‌پدیا:گزارش دیتابیس/برای انتقال ویکی‌پدیا')
    print "Starting NS 4"
    main('4',correectList)

    correectList=get_whiteList (u'ویکی‌پدیا:گزارش دیتابیس/برای انتقال راهنما')
    print "Starting NS 12"
    main('12',correectList)

if __name__ == "__main__":
    run()