From 8d5d300333cfe2b8515bf818a40945b1b7f9a109 Mon Sep 17 00:00:00 2001 From: Saeid Darvish Date: Sat, 9 Nov 2019 23:24:09 +0330 Subject: [PATCH 001/226] start l15 --- index.rst | 1 + lessons/l15.rst | 75 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 lessons/l15.rst diff --git a/index.rst b/index.rst index 908977d..a7cf045 100644 --- a/index.rst +++ b/index.rst @@ -29,6 +29,7 @@ lessons/l12 lessons/l13 lessons/l14 + lessons/l15 log donate-report python-interactive diff --git a/lessons/l15.rst b/lessons/l15.rst new file mode 100644 index 0000000..e5324ad --- /dev/null +++ b/lessons/l15.rst @@ -0,0 +1,75 @@ +.. role:: emoji-size + +.. meta:: + :description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، آموزش ماژول re در پایتون، عبارات باقاعده در پایتون، Regular expression در پایتون، regex در پایتون + :keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, تابع, کتابخانه, پایتون, re + + +درس ۱۵: کتابخانه استاندارد پایتون: re +====================================== + +**عبارات با قاعده** (**Regular expression**) یا به اختصار **regex**، رشته‌ای حاوی کاراکترهایی خاص و با معنی است که در عملیات‌هایی مانند یافتن (find)، جاگذاری (repleace) و اعتبارسنجی (validation) به شدت کاربرد پیدا کرده است. در واقع با استفاده از regex می‌توان یک الگو (pattern) برای جستجو در متن یا تطابق آن ایجاد کرد. [`ویکی‌پدیا `__] + +در این درس به شرح قواعد موجود در regex و همچنین ماژول ``re`` از کتابخانه استاندارد پایتون خواهیم پرداخت [`اسناد پایتون `__]. ماژول ``re`` یک مجموعه ابزار برای کار با regex در پایتون را فراهم آورده است که می‌توان آن را موتور تحلیل regex در پایتون دانست. + + + + + +:emoji-size:`✔` سطح: متوسط + +---- + + +.. contents:: سرفصل‌ها + :depth: 2 + +---- + +عبارات باقاعده +----------------- + +قواعد «عبارات باقاعده» شامل استفاده و چیدمان تعدادی کاراکتر خاص می‌شود که در مجموع معنی یا الگویی را به وجود می‌آورند!. در ادامه به بررسی این کاراکترها می‌پردازیم. + + +کاراکترهای تطابق (Matching Characters) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +در عمل تطبیق (Match) با regex، اکثر حروف و کاراکتر‌ها معرف خود هستند. برای مثال کلمه ``test`` با همان کلمه test تطابق یا همخوانی پیدا می‌کند. اما برخی کاراکترها هستند که به جای همخوانی با خود، مفهوم یا الگویی خاص را می‌رساند که عبارتند از:: + + . ^ $ * + ? { } [ ] \ | ( ) + + +* **.** + + به معنی «هر کاراکتری» می‌باشد و با هر کاراکتری تطابق یا همخوانی خواهد داشت. + + + +* **^** + + در یک کاربرد تعین کننده نقطه آغاز تطابق و شروع الگو می‌باشد (کاربرد دیگر آن در ادامه ذکر می‌گردد). + + + +* **[ ]** + + از دو کاراکتر ``[`` و ``]`` برای بیان یک دسته یا بازه از کاراکترها استفاده می‌شود که برای این منظور می‌توان تک تک کاراکترها را به صورت صریح نوشت یا با استفاده از کاراکتر ``-`` به سادگی یک بازه را تعیین نمود. + + + + + + + + +| + +---- + +:emoji-size:`😊` امیدوارم مفید بوده باشه + +`لطفا دیدگاه و سوال‌های مرتبط با این درس خود را در کدرز مطرح نمایید. `_ + + + From a0833f1289e1c9ad5fe4c7d8757e64c01f356243 Mon Sep 17 00:00:00 2001 From: Saeid Darvish Date: Fri, 28 Feb 2020 14:13:38 +0330 Subject: [PATCH 002/226] fix style --- _templates/sphinx_minoo_theme/layout.html | 2 +- _templates/sphinx_minoo_theme/static/minoo.css | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/_templates/sphinx_minoo_theme/layout.html b/_templates/sphinx_minoo_theme/layout.html index d6f7225..68df9f7 100644 --- a/_templates/sphinx_minoo_theme/layout.html +++ b/_templates/sphinx_minoo_theme/layout.html @@ -47,7 +47,7 @@ - diff --git a/_templates/sphinx_minoo_theme/static/minoo.css b/_templates/sphinx_minoo_theme/static/minoo.css index 22c482b..7ade952 100644 --- a/_templates/sphinx_minoo_theme/static/minoo.css +++ b/_templates/sphinx_minoo_theme/static/minoo.css @@ -326,7 +326,7 @@ margin-top:100px; .donate-badge{ position: fixed; - bottom: 8px; + bottom: 12px; z-index: 999999; left: 40px; display:none; @@ -383,4 +383,16 @@ text-align: inherit; .top-red{display:none !important;} } +ul li p:last-child {margin-bottom: 24px !important;} + +a.side-donate{ + background-color: #66BB6A; + margin: 0px 2px; + color: white; + padding: 2px 10px; +} + +a.hover{ + background-color: #4CAF50; +} From 6f7c3457715e591490fe85d1efab894edb1af873 Mon Sep 17 00:00:00 2001 From: Saeid Darvish Date: Fri, 28 Feb 2020 16:43:25 +0330 Subject: [PATCH 003/226] works on specials characters rules --- lessons/l15.rst | 141 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 131 insertions(+), 10 deletions(-) diff --git a/lessons/l15.rst b/lessons/l15.rst index e5324ad..e18fa1b 100644 --- a/lessons/l15.rst +++ b/lessons/l15.rst @@ -5,12 +5,12 @@ :keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, تابع, کتابخانه, پایتون, re -درس ۱۵: کتابخانه استاندارد پایتون: re -====================================== +درس ۱۵: کتابخانه استاندارد پایتون: Regular expression در پایتون - re +============================================================================ -**عبارات با قاعده** (**Regular expression**) یا به اختصار **regex**، رشته‌ای حاوی کاراکترهایی خاص و با معنی است که در عملیات‌هایی مانند یافتن (find)، جاگذاری (repleace) و اعتبارسنجی (validation) به شدت کاربرد پیدا کرده است. در واقع با استفاده از regex می‌توان یک الگو (pattern) برای جستجو در متن یا تطابق آن ایجاد کرد. [`ویکی‌پدیا `__] +**عبارات با قاعده** (**Regular expression**) یا به اختصار **RegEx**، رشته‌ای حاوی کاراکترهایی خاص و با معنی است که در عملیات‌هایی مانند یافتن (find)، جاگذاری (repleace) و اعتبارسنجی (validation) به شدت کاربرد پیدا کرده است. در واقع با استفاده از RegEx می‌توان یک الگو (pattern) برای جستجو در متن یا تطابق آن ایجاد کرد. [`ویکی‌پدیا `__] -در این درس به شرح قواعد موجود در regex و همچنین ماژول ``re`` از کتابخانه استاندارد پایتون خواهیم پرداخت [`اسناد پایتون `__]. ماژول ``re`` یک مجموعه ابزار برای کار با regex در پایتون را فراهم آورده است که می‌توان آن را موتور تحلیل regex در پایتون دانست. +در این درس به شرح قواعد موجود در RegEx و همچنین ماژول ``re`` از کتابخانه استاندارد پایتون خواهیم پرداخت [`اسناد پایتون `__]. ماژول ``re`` یک مجموعه ابزار برای کار با RegEx در پایتون را فراهم آورده است که می‌توان آن را موتور تحلیل RegEx در پایتون دانست. @@ -35,29 +35,150 @@ کاراکترهای تطابق (Matching Characters) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -در عمل تطبیق (Match) با regex، اکثر حروف و کاراکتر‌ها معرف خود هستند. برای مثال کلمه ``test`` با همان کلمه test تطابق یا همخوانی پیدا می‌کند. اما برخی کاراکترها هستند که به جای همخوانی با خود، مفهوم یا الگویی خاص را می‌رساند که عبارتند از:: +در عمل تطبیق (Match) با RegEx، اکثر حروف و کاراکتر‌ها معرف خود همان کاراکتر است. برای مثال کاراکتر ``a`` معرف ``a`` است و کلمه ``test`` نیز با همان کلمه ``test`` تطابق یا همخوانی پیدا می‌کند. - . ^ $ * + ? { } [ ] \ | ( ) +با این حال برخی از کاراکترها هستند که به جای همخوانی با خود، مفهوم یا الگویی دیگر را می‌رساند که عبارتند از:: -* **.** + . ^ $ * + ? [] {} \ | () - به معنی «هر کاراکتری» می‌باشد و با هر کاراکتری تطابق یا همخوانی خواهد داشت. +* Period ``.`` + به معنی «هر کاراکتری» می‌باشد و با هر کاراکتری تطابق یا همخوانی خواهد داشت (به جز کاراکتر newline یا ``n\``). -* **^** + + +* Caret ``^`` در یک کاربرد تعین کننده نقطه آغاز تطابق و شروع الگو می‌باشد (کاربرد دیگر آن در ادامه ذکر می‌گردد). + :: + + ^a + a => Matched + abc => Matched + bac => NO Matched ('a' is not in the start) + + :: + + ^ab + abc => Matched + acb => NO Matched (starts with 'a' but not followed by 'b') + + +* Dollar ``$`` + + تعین کننده نقطه پایان تطابق الگو می‌باشد. + + + :: + + a$ + a => Matched + formula => Matched + cab => NO Matched ('a' is not in the end) + + + :: + + ^s...d$ + + به عنوان مثالی دیگر، الگوی بالا معرف هر کلمه پنج کاراکتری است که با کاراکتر ``s`` شروع و با کاراکتر ``d`` پایان می‌پذیرد. + + +* Star ``*`` + + معرف **هیچ** یا **هر تعداد** تکرار الگوی سمت چپ خود می‌باشد. + + + :: + + ma*n + mn => Matched + man => Matched + maaan => Matched + main => NO Matched ('a' is not followed by 'n') + woman => Matched + + +* Plus ``+`` + + معرف **یک** یا **هر تعداد** تکرار الگوی سمت چپ خود می‌باشد. + + + :: + + ma+n + mn => NO Matched (no 'a' character) + man => Matched + maaan => Matched + main => NO Matched ('a' is not followed by 'n') + woman => Matched -* **[ ]** + + +* Question Mark ``?`` + + معرف **هیج** یا **یک** تکرار الگوی سمت چپ خود می‌باشد. + + + :: + + ma?n + mn => Matched + man => Matched + maaan => NO Matched (more than one 'a' character) + main => NO Matched ('a' is not followed by 'n') + woman => Matched + + + +* Square brackets ``[ ]`` از دو کاراکتر ``[`` و ``]`` برای بیان یک دسته یا بازه از کاراکترها استفاده می‌شود که برای این منظور می‌توان تک تک کاراکترها را به صورت صریح نوشت یا با استفاده از کاراکتر ``-`` به سادگی یک بازه را تعیین نمود. + :: + + [abc] + + برای نمونه، الگوی بالا با هر رشته‌ای که حاوی کاراکتر‌های ``b`` ،``a`` یا ``c`` باشد تطابق خواهد داشت [`regex101@ تست آنلاین `__]. + + + :: + + [abc] + a => 1 Matched + ac => 2 Matched + python => NO Matched + abc de ca => 5 Matched + + + همانطور که بیان شد، با استفاده از کاراکتر ``-`` هر دو بخش روبرو در نمونه کد پایین با یکدیگر معادل و برابر هستند:: + + [0-9] == [0123456789] + [1-4] == [1234] + [a-e] == [abcde] + [1-5a-e] == [12345abcde] + [0-39] == [01239] + [a-eA-E] == [abcdeABCDE] + + + .. note:: + باید توجه داشت RegEx ذاتا CASE SENSITIVE است و کوچک یا بزرگ بودن حروف انگلیسی در آن تاثیر دارد. با این حال زبان‌های برنامه‌نویسی از جمله پایتون امکاناتی را برای غیرفعال ساختن این وضعیت فراهم می‌آورند که در ادامه بررسی خواهد شد. + + + **کاربرد دوم کاراکتر ^ (Caret)** + + اکنون زمان آن رسیده است تا با کاربرد دوم کاراکتر Caret ``^`` آشنا شویم: با قرار دادن این کاراکتر به عنوان عضو ابتدای یک ``[ ]`` می‌توان عملکرد یا مفهوم آن را برعکس‌ یا در واقع NOT کرد! برای نمونه الگوی ``[abc^]`` به معنی تطابق با هر کاراکتری است به جز ``b`` ،``a`` و ``c``. [`regex101@ تست آنلاین `__] + + + +* Braces ``{ }`` + با ساختاری مشابه ``{n,m}`` به کار می‌رود که در آن ``n`` و ``m`` به ترتیب بیان کننده حداقل و حداکثر تعداد تکرار الگوی سمت چپ خود می‌باشند. From 26b5cab9d684353a310b2753aa93a0a703d2077f Mon Sep 17 00:00:00 2001 From: Saeid Darvish Date: Sat, 29 Feb 2020 01:00:31 +0330 Subject: [PATCH 004/226] works on specials characters rules 2 --- lessons/l15.rst | 100 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 88 insertions(+), 12 deletions(-) diff --git a/lessons/l15.rst b/lessons/l15.rst index e18fa1b..2028b93 100644 --- a/lessons/l15.rst +++ b/lessons/l15.rst @@ -38,34 +38,66 @@ در عمل تطبیق (Match) با RegEx، اکثر حروف و کاراکتر‌ها معرف خود همان کاراکتر است. برای مثال کاراکتر ``a`` معرف ``a`` است و کلمه ``test`` نیز با همان کلمه ``test`` تطابق یا همخوانی پیدا می‌کند. -با این حال برخی از کاراکترها هستند که به جای همخوانی با خود، مفهوم یا الگویی دیگر را می‌رساند که عبارتند از:: +با این حال برخی از کاراکترها هستند که به جای همخوانی با خود، مفهوم دیگری را می‌رسانند که عبارتند از:: - . ^ $ * + ? [] {} \ | () + . ^ $ * + ? [] {} | () \ -* Period ``.`` +* Dot ``.`` - به معنی «هر کاراکتری» می‌باشد و با هر کاراکتری تطابق یا همخوانی خواهد داشت (به جز کاراکتر newline یا ``n\``). + به معنی «هر کاراکتری» می‌باشد. یعنی وجود ``.`` در یک الگو (Pattern) باعث انجام عمل تطابق یا همخوانی با هر کاراکتری خواهد شد (به جز کاراکتر newline یا ``n\``). + + .. tip:: + به صورت پیش‌فرض ``.`` در الگوی RegEx کاراکتر newline را شامل نمی‌شود ولی در زبان برنامه‌نویسی پایتون می‌توان با نشانه‌گذاری ``re.DOTALL`` کاری کرد که کاراکتر newline را نیز شامل شود. *نمونه کد مربوط به این بحث در بخش بعدی بررسی خواهد شد.* + + به عنوان نمونه الگوی ``...`` هر سه کاراکتر متوالی را در بر می‌گیرد:: + + ... + + + :: + + 'ab' => no matche + 'abc1234' => 2 matches ('abc', '123') + '01267' => 1 matche ('012') + 'python' => 2 matches ('pyt', 'hon') + '2 0 85 ad' => 3 matches ('2 0', ' 85', ' a') + + [`regex101@ تست آنلاین `__] * Caret ``^`` - در یک کاربرد تعین کننده نقطه آغاز تطابق و شروع الگو می‌باشد (کاربرد دیگر آن در ادامه ذکر می‌گردد). + در یک کاربرد در سمت چپ یک الگو قرار می‌گیرد و تعین کننده الزام شروع با آن الگو (Pattern) می‌باشد (*کاربرد دیگر آن در ادامه ذکر خواهد شد*). :: - ^a - a => Matched - abc => Matched - bac => NO Matched ('a' is not in the start) + ^a + :: - ^ab - abc => Matched - acb => NO Matched (starts with 'a' but not followed by 'b') + 'a' => 1 matche ('a') + 'abc' => 1 matche ('a') + 'bac' => no matche ('a' is not in the start) + + [`regex101@ تست آنلاین `__] + + + :: + + ^ab + + :: + + 'abc' => 1 matche ('ab') + 'acb' => no matche (starts with 'a' but not followed by 'b') + 'ab123 ab456' => 1 matche ('ab' from ab123) + + + [`regex101@ تست آنلاین `__] * Dollar ``$`` @@ -181,6 +213,50 @@ با ساختاری مشابه ``{n,m}`` به کار می‌رود که در آن ``n`` و ``m`` به ترتیب بیان کننده حداقل و حداکثر تعداد تکرار الگوی سمت چپ خود می‌باشند. + :: + + a{2,3} + abc dat => NO Matched + abc daat => 1 Matched (at d'aa't) + aabc daaat => 2 Matched (at 'aa'bc and d'aaa't) + aabc daaaat => 2 Matched (at 'aa'bc and d'aaa'at) + + + [`regex101@ تست آنلاین `__] + + :: + + [0-9]{2,4} + 1 => NO Matched + ab123cde => 1 Matched (at ab'123'cde) + 12 => 1 Matched + 123456789 => 2 Matched (at '1234' and '5678') + 1 2 3 4 => NO Matched + + + [`regex101@ تست آنلاین `__] + + + +* Alternation ``|`` + + این کاراکتر مفهومی معادلی عملگر ``OR`` (یا) دارد که معرف تطابق با الگوی سمت راست **یا** سمت چپ خود می‌باشد. + + + :: + + a|b + cde => NO Matched + ade => 1 Matched (at 'a'de) + acdbea => 3 Matched (at 'a'cd'b'e'a') + + [`regex101@ تست آنلاین `__] + + + +* Group ``()`` + + این کاراکتر From 9d8a96d3ae35534f191379cc6ecb51aa8b57ca47 Mon Sep 17 00:00:00 2001 From: Saeid Darvish Date: Fri, 1 May 2020 22:41:16 +0430 Subject: [PATCH 005/226] complete metacharacters --- lessons/l15.rst | 71 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 67 insertions(+), 4 deletions(-) diff --git a/lessons/l15.rst b/lessons/l15.rst index 2028b93..64b32b9 100644 --- a/lessons/l15.rst +++ b/lessons/l15.rst @@ -38,7 +38,7 @@ در عمل تطبیق (Match) با RegEx، اکثر حروف و کاراکتر‌ها معرف خود همان کاراکتر است. برای مثال کاراکتر ``a`` معرف ``a`` است و کلمه ``test`` نیز با همان کلمه ``test`` تطابق یا همخوانی پیدا می‌کند. -با این حال برخی از کاراکترها هستند که به جای همخوانی با خود، مفهوم دیگری را می‌رسانند که عبارتند از:: +با این حال برخی از کاراکترها هستند که به جای همخوانی با خود، مفهوم دیگری را می‌رسانند که از آن‌ها با عنوان ``metacharacters`` (متاکاراکترها) یاد می‌شود [`اسناد پایتون `__] و عبارتند از:: . ^ $ * + ? [] {} | () \ @@ -237,8 +237,23 @@ [`regex101@ تست آنلاین `__] + چنانچه از ``{ }`` با ساختاری مشابه ``{n}`` به کار برود، مفهوم تعداد تکرار دقیق (لازم) الگوی سمت چپ خود را می‌رساند. -* Alternation ``|`` + + :: + + [0-9]{3} + 1 => NO Matched + ab123cde => 1 Matched (at ab'123'cde) + 12 => NO Matched + 123456789 => 3 Matched (at '123' and '456' and '789') + 1 2 3 4 => NO Matched + + [`regex101@ تست آنلاین `__] + + + +* Pipe ``|`` این کاراکتر مفهومی معادلی عملگر ``OR`` (یا) دارد که معرف تطابق با الگوی سمت راست **یا** سمت چپ خود می‌باشد. @@ -254,9 +269,57 @@ -* Group ``()`` +* Parentheses ``()`` + + برای گروه‌بندی الگوها از پرانتز استفاده می‌شود یعنی می‌توان الگویی را با استفاده از یک یا چند زیرالگو (sub-patterns) ایجاد کرد. + + + :: + + (a|b|c)xz + + ab xz => NO Matched + abxz => 1 Matched (at a'bxz') + axz cabxz => 2 Matched (at 'axz'bc ca'bxz') + + + این الگو تمامی حروفی که شامل یکی از کاراکترهای ``a`` یا ``b`` یا ``c`` بوده و در ادامه ``xz`` باشد را تطبیق می‌دهد. + + [`regex101@ تست آنلاین `__] + + + + +* Backslash ``\`` + + از این کاراکتر برای بی‌اثر کردن مفهوم هر یک از metacharacters در الگو استفاده می‌شود. برای نمونه قرار گرفتن ``*\`` در یک الگو، تنها خود کاراکتر ``*`` را تطبیق می‌دهد و به عبارتی دیگر کاراکتر ``*`` در این جا مفهوم الگویی خود (تکرار الگو سمت چپ) را از دست داده است. + + + :: + + [0-9]\.[0-9]{2} + + 3 => NO Matched + 3.55 => 1 Matched (at '3.55') + 5.2 => NO Matched + 7.37520 => 1 Matched (at '7.37') + 506.035 => 1 Matched (at '6.03') + + [`regex101@ تست آنلاین `__] + + + + + + + + + + + + + - این کاراکتر From c64e75a4c41d070c851c75f3e5b83d6d02acf7c1 Mon Sep 17 00:00:00 2001 From: Saeid Darvish Date: Fri, 29 May 2020 21:49:19 +0430 Subject: [PATCH 006/226] complete Special sequences --- lessons/l15.rst | 209 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 191 insertions(+), 18 deletions(-) diff --git a/lessons/l15.rst b/lessons/l15.rst index 64b32b9..9b9dc99 100644 --- a/lessons/l15.rst +++ b/lessons/l15.rst @@ -110,7 +110,7 @@ a$ a => Matched formula => Matched - cab => NO Matched ('a' is not in the end) + cab => NO Match ('a' is not in the end) :: @@ -131,7 +131,7 @@ mn => Matched man => Matched maaan => Matched - main => NO Matched ('a' is not followed by 'n') + main => NO Match ('a' is not followed by 'n') woman => Matched @@ -143,10 +143,10 @@ :: ma+n - mn => NO Matched (no 'a' character) + mn => NO Match (no 'a' character) man => Matched maaan => Matched - main => NO Matched ('a' is not followed by 'n') + main => NO Match ('a' is not followed by 'n') woman => Matched @@ -161,8 +161,8 @@ ma?n mn => Matched man => Matched - maaan => NO Matched (more than one 'a' character) - main => NO Matched ('a' is not followed by 'n') + maaan => NO Match (more than one 'a' character) + main => NO Match ('a' is not followed by 'n') woman => Matched @@ -184,7 +184,7 @@ [abc] a => 1 Matched ac => 2 Matched - python => NO Matched + python => NO Match abc de ca => 5 Matched @@ -199,7 +199,7 @@ .. note:: - باید توجه داشت RegEx ذاتا CASE SENSITIVE است و کوچک یا بزرگ بودن حروف انگلیسی در آن تاثیر دارد. با این حال زبان‌های برنامه‌نویسی از جمله پایتون امکاناتی را برای غیرفعال ساختن این وضعیت فراهم می‌آورند که در ادامه بررسی خواهد شد. + باید توجه داشت RegEx ذاتا CASE SENSITIVE است و کوچک یا بزرگ بودن حروف انگلیسی در آن **تاثیر دارد**. با این حال زبان‌های برنامه‌نویسی از جمله پایتون امکاناتی را برای غیرفعال ساختن این وضعیت فراهم می‌آورند که در ادامه بررسی خواهد شد. **کاربرد دوم کاراکتر ^ (Caret)** @@ -216,7 +216,7 @@ :: a{2,3} - abc dat => NO Matched + abc dat => NO Match abc daat => 1 Matched (at d'aa't) aabc daaat => 2 Matched (at 'aa'bc and d'aaa't) aabc daaaat => 2 Matched (at 'aa'bc and d'aaa'at) @@ -227,11 +227,11 @@ :: [0-9]{2,4} - 1 => NO Matched + 1 => NO Match ab123cde => 1 Matched (at ab'123'cde) 12 => 1 Matched 123456789 => 2 Matched (at '1234' and '5678') - 1 2 3 4 => NO Matched + 1 2 3 4 => NO Match [`regex101@ تست آنلاین `__] @@ -243,11 +243,11 @@ :: [0-9]{3} - 1 => NO Matched + 1 => NO Match ab123cde => 1 Matched (at ab'123'cde) - 12 => NO Matched + 12 => NO Match 123456789 => 3 Matched (at '123' and '456' and '789') - 1 2 3 4 => NO Matched + 1 2 3 4 => NO Match [`regex101@ تست آنلاین `__] @@ -261,7 +261,7 @@ :: a|b - cde => NO Matched + cde => NO Match ade => 1 Matched (at 'a'de) acdbea => 3 Matched (at 'a'cd'b'e'a') @@ -278,7 +278,7 @@ (a|b|c)xz - ab xz => NO Matched + ab xz => NO Match abxz => 1 Matched (at a'bxz') axz cabxz => 2 Matched (at 'axz'bc ca'bxz') @@ -299,9 +299,9 @@ [0-9]\.[0-9]{2} - 3 => NO Matched + 3 => NO Match 3.55 => 1 Matched (at '3.55') - 5.2 => NO Matched + 5.2 => NO Match 7.37520 => 1 Matched (at '7.37') 506.035 => 1 Matched (at '6.03') @@ -309,16 +309,189 @@ +توالی‌های ویژه (Special sequences) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +در بحث عبارات باقاعده هنگامی که کاراکتر ``\`` به همراه یک کاراکتر مشخص (به شرح زیر) آورده شود، Special sequence خوانده می‌شود. Special sequences برای سهولت در نوشتن الگوها کاربرد دارند که برخی از پر کاربردترین آن‌ها عبارتند از:: + \A \b \B \d \D \s \S \w \W +* ``A\`` + برای تعین شروع یک متن به کار می‌رود. برای نمونه، الگوی ``AThe\`` تمام رشته‌هایی که با ``The`` شروع شوند را تطبیق می‌دهد (یادآوری: در بحث RegEx، کوچک یا بزرگ بودن حروف دارای اهمیت است). + :: + + \AThe + + The Rain => Match + In The Rain => NO Match + + [`regex101@ تست آنلاین `__] + + + +* ``b\`` + + بر حسب موقعیت قرار گرفتن، شروع یا پایان یک **کلمه** را مشخص می‌کند. + + :: + + \bunder + + understand => Match + underworld => Match + Underworld => NO Match + TheUnderworld => NO Match + + [`regex101@ تست آنلاین `__] + + + + :: + + ing\b + + Driving => Match + Spring => Match + spring_day => NO Match + + [`regex101@ تست آنلاین `__] + + +* ``B\`` + + برعکس ``b\``، بر حسب موقعیت قرار گرفتن شروع یا پایان **نیافتن** یک **کلمه** را مشخص می‌کند. یعنی کلماتی را تطبیق می‌دهد که با کاراکتر یا کارکترهایی مشخصی شروع یا پایان نیافته باشند. + + :: + + \Bunder + + understand => NO Match + underworld => NO Match + Underworld => NO Match + Thunderbird => Match + + [`regex101@ تست آنلاین `__] + + + :: + + ball\B + + Football => NO Match + Footballist => Match + + [`regex101@ تست آنلاین `__] + + +* ``d\`` + + معادل ``[9-0]`` + + :: + + \d{3,5} + + 1 => NO Match + 123 => 1 Matched (at '123') + 123456 => 1 Matched (at '12345') + 1237 Main Street, => 1 Matched (at '1237') + + [`regex101@ تست آنلاین `__] + + + +* ``D\`` + + برعکس ``d\`` - معادل ``[9-0^]``، یعنی تمامی کاراکترهای غیر عددی را تطبیق می‌دهد. + + :: + \D{3,5} + 1 => NO Match + 123 => NO Match + 123456 => NO Match + 1237 Main Street, => 3 Matched (at ' Main', ' Stre', 'et,') + + [`regex101@ تست آنلاین `__] + + +* ``s\`` + + معادل ``[t\n\r\f\v\ ]``، به معنی عمل تطبیق با کاراکتر فضای خالی است. + + :: + + \s + + 1237 Main Street, => 2 Matched (2 spaces) + + [`regex101@ تست آنلاین `__] + + + + + البته باید توجه داشته که منظور از کاراکترهای ``t \n \r \f \v\`` همان Escape character هستند [`ویکی‌پدیا `__]. + + :: + + \n ---> new line + \r ---> carriage return + \t ---> tab + \v ---> vertical tab + \f ---> form feed + + + + + + +* ``S\`` + + برعکس ``s\`` - معادل ``[t\n\r\f\v\ ^]``، به معنی عمل تطبیق با هر کاراکتری غیر از فضای خالی است. + + :: + + \S{2,5} + + 1237 Main Street, => 4 Matched (at '1237', 'Main', 'Stree', 't,') + + [`regex101@ تست آنلاین `__] + + +* ``w\`` + + معادل ``[_a-zA-Z0-9]``، به معنی عمل تطبیق با کاراکترهای الفبایی و عددی (زبان انگلیسی) به همراه کاراکتر ``_`` یا underscore. + + :: + + \w{2,5} + + 1237 Main Street, => 3 Matched (at '1237', 'Main', 'Stree') + + [`regex101@ تست آنلاین `__] + + +* ``W\`` + + برعکس ``w\`` - معادل ``[_a-zA-Z0-9^]``، به معنی عمل تطبیق با کاراکتری به غیر از کاراکترهای الفبایی و عددی (زبان انگلیسی) به همراه کاراکتر ``_`` یا underscore. + + :: + + \W + + 1237 Main Street, => 3 Matched (2 spaces and ',') + + [`regex101@ تست آنلاین `__] + + +ماژول re پایتون +----------------- From c3249fdd23c949653f04d93db381131a2d1b72a6 Mon Sep 17 00:00:00 2001 From: Saeid Darvish Date: Sat, 31 Oct 2020 23:12:35 +0330 Subject: [PATCH 007/226] continue re --- lessons/l15.rst | 218 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 218 insertions(+) diff --git a/lessons/l15.rst b/lessons/l15.rst index 9b9dc99..8c046d8 100644 --- a/lessons/l15.rst +++ b/lessons/l15.rst @@ -493,6 +493,224 @@ ماژول re پایتون ----------------- +آنچه از عبارات باقاعده تاکنون آشنا شدیم تنها شامل تعدادی تعاریف و قواعد بودند که برای استفاده و به کار بردن آنها در زبان‌های برنامه‌نویسی نیاز به ابزارهایی می‌باشد. همچنین باید توجه داشت انجام تمامی امور مربوط به پردازش متن را نباید از عبارات باقاعده انتظار داشت چرا که این قواعد هم محدودیت‌های خاص خود را دارد و در مواردی ممکن است الگوی ایجاد شده چنان پیچیده گردد که از خوانایی برنامه کاسته شود. + +در زبان برنامه‌نویسی پایتون از طریق ماژول ``re`` از کتابخانه استاندارد آن، ثابت‌ها (constants) و توابع (functions) کاربردی بسیاری در زمینه عبارت باقاعده فراهم آورده شده است. در ادامه به بررسی برخی این از این توابع و نکات پیرامون آن‌ها خواهیم پرداخت: + + + +* ``re.compile(pattern, flags=0)`` + + تابع ``compile`` یک الگوی RegEx را کامپایل و یک شی RegEx پایتونی [`اسناد پایتون `__] برمی‌گرداند. [`اسناد پایتون `__] + + این تابع دو پارامتر دارد: ``pattern`` که معرف الگو RegEx مورد نظر می‌باشد و ``flags`` که با توجه به داشتن مقدار پیش‌فرض ``0``، ارسال آرگومان به آن اختیاری است. + + پیش از ادامه با این تابع، بهتر است با مقادیر مجاز برای پارامتر ``flags`` آشنا شویم، چرا که این پارامتر اختیاری در توابع دیگری از ماژول ``re`` نیز مورد استفاده قرار گرفته است. در واقع با استفاده از این پارامتر می‌توان چگونگی پردازش الگو را دستخوش تغییراتی ساخت که گاهی ممکن است بسیار کارگشا باشند. [`اسناد پایتون `__]: + + + * ``re.I`` یا ``re.IGNORECASE`` + + نادیده گرفتن حروف کوچک یا بزرگ - یعنی صرف نظر از اینکه در الگوی مورد نظر از کاراکتر بزرگ استفاده شده باشد یا کوچک، عمل انطباق با آن کاراکتر صورت پذیرد. [`اسناد پایتون `__] + + + + * ``re.M`` یا ``re.MULTILINE`` + + سطرها در نظر گرفته شوند - در حالت عادی کاراکترهای تطابق ``^`` و ``$`` در الگو RegEx مشخص کننده ابتدا و انتهای یک رشته یا متن می‌باشند. فارغ از اینکه متن مورد نظر می‌تواند شامل چندین سطر باشد عمل تطابق با کل متن به انجام می‌رسد. اما با استفاده از این flag می‌توان مفهوم سطر را نیز پر رنگ کرد، به این صورت که: کاراکتر ``^`` مشخص کننده ابتدای هر سطر و کاراکتر ``$`` نیز مشخص کننده انتهای هر سطر خواهد بود. [`اسناد پایتون `__] + + + + * ``re.S`` یا ``re.DOTALL`` + + کاراکتر ``.`` شامل تمامی کاراکترها باشد - در حالت عادی این کاراکتر عمل تطابق با کاراکتر سطر جدید ``n\`` را شامل نمی‌شود که با استفاده از این flag این ویژگی به الگو اضافه می‌گردد. [`اسناد پایتون `__] + + + + + * ``re.X`` یا ``re.VERBOSE`` + + الگو حاوی توضیح (Comment) است - با استفاده از این flag می‌توان توضیح را به الگو اضافه کرد که نقش زیادی در بالا بردن خوانایی و درک الگو ایجاد می‌کند. [`اسناد پایتون `__] + + + + .. tip:: + می‌توان با استفاده از کاراکتر ``|`` در زمان ارسال آرگومان به flags، همزمان چندین مقدار را تنظیم نمود. به مانند: ``re.compile(pattern, re.I | re.M)`` + + + پارامتر flags می‌تواند مقادیر دیگری نیز بپذیرد که برای مطالعه بیشتر می‌توانید به مستندات پایتون مراجعه نمایید. + + + به تابع ``compile`` برمی‌گردیم:: + + + >>> # Python 3.x + >>> + >>> import re + >>> + >>> pattern = re.compile("^", re.I) + >>> + >>> type(pattern) + + >>> + >>> print(pattern) + re.compile('^', re.IGNORECASE) + + + :: + + >>> # Python 2.x + >>> + >>> import re + >>> + >>> pattern = re.compile("^", re.I) + >>> + >>> type(pattern)s + + >>> + >>> print pattern + <_sre.SRE_Pattern object at 0x7f22cf27ac00> + + + کاربرد تابع ``compile`` زمانی است که می‌خواهیم از یک الگو مشخص چندین بار در طول اجرای یک ماژول استفاده نماییم. در ادامه با توابع دیگری از ماژول ``re`` آشنا خواهیم شد؛ این توابع پیش از انجام وظیفه مربوط به خود، به صورت ضمنی الگو را به شی ``re.Pattern`` یا ``sre.SRE_Pattern_`` (در پایتون 2x) کامپایل می‌کنند که به این صورت می‌توان کارایی برنامه را با یک بار ``compile`` افزایش دهیم. البته باید اشاره کرد که مفسر پایتون به صورت خودکار نمونه کامپایل شده چند الگو آخر مورد استفاده را Cache می‌کند، بنابراین چنانچه در برنامه‌ خود از تعداد اندکی الگو استفاده می‌کنید، می‌توانید در این زمینه نگران کارایی نباشید. + + یادآوری شود که با استفاده از تابع ``dir`` می‌توانیم متدها و صفت‌های شی الگو را مشاهده نماییم:: + + >>> dir(pattern) # Python 3.x + ['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'findall', 'finditer', 'flags', 'fullmatch', 'groupindex', 'groups', 'match', 'pattern', 'scanner', 'search', 'split', 'sub', 'subn'] + >>> + + + + +* ``search(pattern, string, flags=0)`` + + تابع ``search`` به دنبال اولین انطباق pattern در string می‌گردد، در صورت موفقیت یک شی ``Match`` [`اسناد پایتون `__] و در غیر این صورت ``None`` برمی‌گرداند [`اسناد پایتون `__]:: + + + >>> # Python 2.x + >>> + >>> import re + >>> + >>> match = re.search('Py...n', 'Python is great') + >>> + >>> type(match) + + >>> + + + + :: + + + >>> # Python 3.x + >>> + >>> import re + >>> + >>> match = re.search('Py...n', 'Python is great') + >>> + >>> type(match) + + + + پیش از صحبت در مورد شی ``Match`` اجازه بدهید یاد آوری کنیم که دو نمونه کد زیر عملکردی معادل یکدیگر دارند:: + + >>> pattern = re.compile('Py...n') + >>> match = pattern.search('Python is great') + + :: + + >>> match = re.search('Py...n', 'Python is great') + + + + شی ``Match``:: + + >>> match = pattern.search('Python is great') + >>> + >>> if match: + ... print(match.group()) + ... else: + ... print("pattern not found") + ... + Python + >>> + + :: + + >>> dir(match) + ['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'end', 'endpos', 'expand', 'group', 'groupdict', 'groups', 'lastgroup', 'lastindex', 'pos', 're', 'regs', 'span', 'start', 'string'] + + به دو نمونه کد زیر توجه نمایید:: + + + >>> string = 'python3 python2 python1' + >>> pattern = 'python.' + >>> match = re.search(pattern, string) + >>> + >>> match.group() + 'python3' + >>> match.group(0) + 'python3' + >>> match.group(1) + Traceback (most recent call last): + File "", line 1, in + IndexError: no such group + >>> + >>> match.groups() + () + >>> + >>> match.start() + 0 + >>> match.end() + 7 + >>> match.span() + (0, 7) + >>> + >>> match.re + re.compile('python.') + >>> + >>> match.string + 'python3 python2 python1' + >>> + + + :: + + >>> string = '39801 356, 2102 1111' + >>> pattern = '(\d{3}) (\d{2})' + >>> match = re.search(pattern, string) + >>> + >>> match.group() + '801 35' + >>> match.group(0) + '801 35' + >>> match.group(1) + '801' + >>> match.group(2) + '35' + >>> match.group(3) + Traceback (most recent call last): + File "", line 1, in + IndexError: no such group + >>> + >>> match.groups() + ('801', '35') + >>> + >>> match.start() + 2 + >>> match.end() + 8 + >>> match.span() + (2, 8) + >>> + >>> match.re + re.compile('(\\d{3}) (\\d{2})') + >>> + >>> match.string + '39801 356, 2102 1111' + >>> + + From af75d1b90a8078e4ee2f7285dbb5c45ca3bdb453 Mon Sep 17 00:00:00 2001 From: Saeid Darvish Date: Mon, 15 Feb 2021 22:50:48 +0330 Subject: [PATCH 008/226] some edit on lesson (15) structure and content --- lessons/l15.rst | 250 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 171 insertions(+), 79 deletions(-) diff --git a/lessons/l15.rst b/lessons/l15.rst index 8c046d8..d15a6a8 100644 --- a/lessons/l15.rst +++ b/lessons/l15.rst @@ -29,7 +29,7 @@ عبارات باقاعده ----------------- -قواعد «عبارات باقاعده» شامل استفاده و چیدمان تعدادی کاراکتر خاص می‌شود که در مجموع معنی یا الگویی را به وجود می‌آورند!. در ادامه به بررسی این کاراکترها می‌پردازیم. +قواعد «عبارات باقاعده» شامل استفاده و چیدمان تعدادی کاراکتر خاص می‌شود که در مجموع معنی یا الگویی را به وجود می‌آورند!. در ادامه در قالب دو دسته Matching Characters و Special Sequences به بررسی این کاراکترها می‌پردازیم. کاراکترهای تطابق (Matching Characters) @@ -113,6 +113,8 @@ cab => NO Match ('a' is not in the end) + [`regex101@ تست آنلاین `__] + :: ^s...d$ @@ -134,6 +136,7 @@ main => NO Match ('a' is not followed by 'n') woman => Matched + [`regex101@ تست آنلاین `__] * Plus ``+`` @@ -149,6 +152,7 @@ main => NO Match ('a' is not followed by 'n') woman => Matched + [`regex101@ تست آنلاین `__] * Question Mark ``?`` @@ -165,6 +169,7 @@ main => NO Match ('a' is not followed by 'n') woman => Matched + [`regex101@ تست آنلاین `__] * Square brackets ``[ ]`` @@ -309,12 +314,12 @@ -توالی‌های ویژه (Special sequences) +توالی‌های ویژه (Special Sequences) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ در بحث عبارات باقاعده هنگامی که کاراکتر ``\`` به همراه یک کاراکتر مشخص (به شرح زیر) آورده شود، Special sequence خوانده می‌شود. Special sequences برای سهولت در نوشتن الگوها کاربرد دارند که برخی از پر کاربردترین آن‌ها عبارتند از:: - \A \b \B \d \D \s \S \w \W + \A \b \B \d \D \s \S \w \W \Z @@ -333,6 +338,11 @@ [`regex101@ تست آنلاین `__] + .. note:: + تفاوت ``A\`` و کاربرد یکم ``^``: در متن‌های چند سطری مشاهده می‌شود به گونه‌ای که ``A\`` به ابتدای کل آن متن و ``^`` به ابتدای هر سطر از متن اشاره می‌کنند. + + + * ``b\`` @@ -364,7 +374,7 @@ * ``B\`` - برعکس ``b\``، بر حسب موقعیت قرار گرفتن شروع یا پایان **نیافتن** یک **کلمه** را مشخص می‌کند. یعنی کلماتی را تطبیق می‌دهد که با کاراکتر یا کارکترهایی مشخصی شروع یا پایان نیافته باشند. + برعکس ``b\``، بر حسب موقعیت قرار گرفتن، شروع یا پایان **نیافتن** یک **کلمه** را مشخص می‌کند. یعنی کلماتی را تطبیق می‌دهد که با کاراکتر یا کارکترهایی مشخصی شروع یا پایان نیافته باشند. :: @@ -490,22 +500,45 @@ [`regex101@ تست آنلاین `__] + + +* ``Z\`` + + برای تعین پایان یک متن به کار می‌رود. برای نمونه، الگوی ``Rain\Z`` تمام رشته‌هایی که با ``Rain`` پایان یابند را تطبیق می‌دهد (یادآوری: در بحث RegEx، کوچک یا بزرگ بودن حروف دارای اهمیت است). + + :: + + Rain\Z + + The Rain => Match + + [`regex101@ تست آنلاین `__] [`regex101@ تست آنلاین `__] + + + .. note:: + تفاوت ``Z\`` و ``$``: در متن‌های چند سطری مشاهده می‌شود به گونه‌ای که ``Z\`` به انتهای کل آن متن و ``$`` به انتهای هر سطر از متن اشاره می‌کنند. + + + + ماژول re پایتون ----------------- آنچه از عبارات باقاعده تاکنون آشنا شدیم تنها شامل تعدادی تعاریف و قواعد بودند که برای استفاده و به کار بردن آنها در زبان‌های برنامه‌نویسی نیاز به ابزارهایی می‌باشد. همچنین باید توجه داشت انجام تمامی امور مربوط به پردازش متن را نباید از عبارات باقاعده انتظار داشت چرا که این قواعد هم محدودیت‌های خاص خود را دارد و در مواردی ممکن است الگوی ایجاد شده چنان پیچیده گردد که از خوانایی برنامه کاسته شود. -در زبان برنامه‌نویسی پایتون از طریق ماژول ``re`` از کتابخانه استاندارد آن، ثابت‌ها (constants) و توابع (functions) کاربردی بسیاری در زمینه عبارت باقاعده فراهم آورده شده است. در ادامه به بررسی برخی این از این توابع و نکات پیرامون آن‌ها خواهیم پرداخت: +در زبان برنامه‌نویسی پایتون از طریق ماژول ``re`` از کتابخانه استاندارد آن، ثابت‌ها (constants) و توابع (functions) کاربردی بسیاری در زمینه عبارت باقاعده فراهم آورده شده است. در ادامه به بررسی برخی این از این توابع و نکات پیرامون آن‌ها خواهیم پرداخت. +تابع ``compile`` و شی RegEx پایتونی +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -* ``re.compile(pattern, flags=0)`` +``re.compile(pattern, flags=0)`` - تابع ``compile`` یک الگوی RegEx را کامپایل و یک شی RegEx پایتونی [`اسناد پایتون `__] برمی‌گرداند. [`اسناد پایتون `__] +تابع ``compile`` یک الگوی RegEx را کامپایل و یک شی RegEx پایتونی [`اسناد پایتون `__] برمی‌گرداند. [`اسناد پایتون `__] - این تابع دو پارامتر دارد: ``pattern`` که معرف الگو RegEx مورد نظر می‌باشد و ``flags`` که با توجه به داشتن مقدار پیش‌فرض ``0``، ارسال آرگومان به آن اختیاری است. +این تابع دو پارامتر دارد: ``pattern`` که معرف الگو RegEx مورد نظر می‌باشد و ``flags`` که با توجه به داشتن مقدار پیش‌فرض ``0``، ارسال آن اختیاری است. - پیش از ادامه با این تابع، بهتر است با مقادیر مجاز برای پارامتر ``flags`` آشنا شویم، چرا که این پارامتر اختیاری در توابع دیگری از ماژول ``re`` نیز مورد استفاده قرار گرفته است. در واقع با استفاده از این پارامتر می‌توان چگونگی پردازش الگو را دستخوش تغییراتی ساخت که گاهی ممکن است بسیار کارگشا باشند. [`اسناد پایتون `__]: +پیش از ادامه با این تابع، بهتر است با مقادیر مجاز برای پارامتر ``flags`` آشنا شویم، چرا که این پارامتر اختیاری در توابع دیگری از ماژول ``re`` نیز مورد استفاده قرار گرفته است. در واقع با استفاده از این پارامتر می‌توان چگونگی پردازش الگو را دستخوش تغییراتی ساخت که گاهی ممکن است بسیار کارگشا باشند. [`اسناد پایتون `__]: * ``re.I`` یا ``re.IGNORECASE`` @@ -540,7 +573,7 @@ پارامتر flags می‌تواند مقادیر دیگری نیز بپذیرد که برای مطالعه بیشتر می‌توانید به مستندات پایتون مراجعه نمایید. - به تابع ``compile`` برمی‌گردیم:: +به تابع ``compile`` برمی‌گردیم:: >>> # Python 3.x @@ -556,7 +589,7 @@ re.compile('^', re.IGNORECASE) - :: +:: >>> # Python 2.x >>> @@ -571,20 +604,27 @@ <_sre.SRE_Pattern object at 0x7f22cf27ac00> - کاربرد تابع ``compile`` زمانی است که می‌خواهیم از یک الگو مشخص چندین بار در طول اجرای یک ماژول استفاده نماییم. در ادامه با توابع دیگری از ماژول ``re`` آشنا خواهیم شد؛ این توابع پیش از انجام وظیفه مربوط به خود، به صورت ضمنی الگو را به شی ``re.Pattern`` یا ``sre.SRE_Pattern_`` (در پایتون 2x) کامپایل می‌کنند که به این صورت می‌توان کارایی برنامه را با یک بار ``compile`` افزایش دهیم. البته باید اشاره کرد که مفسر پایتون به صورت خودکار نمونه کامپایل شده چند الگو آخر مورد استفاده را Cache می‌کند، بنابراین چنانچه در برنامه‌ خود از تعداد اندکی الگو استفاده می‌کنید، می‌توانید در این زمینه نگران کارایی نباشید. +کاربرد تابع ``compile`` زمانی است که می‌خواهیم از یک الگو مشخص چندین بار در طول اجرای یک ماژول استفاده نماییم. در ادامه با توابع دیگری از ماژول ``re`` آشنا خواهیم شد؛ این توابع پیش از انجام وظیفه مربوط به خود، به صورت ضمنی الگو را به شی ``re.Pattern`` یا ``sre.SRE_Pattern_`` (در پایتون 2x) کامپایل می‌کنند که به این صورت می‌توان کارایی برنامه را با یک بار ``compile`` افزایش دهیم. البته باید اشاره کرد که مفسر پایتون به صورت خودکار نمونه کامپایل شده چند الگو آخر مورد استفاده را Cache می‌کند، بنابراین چنانچه در برنامه‌ خود از تعداد اندکی الگو استفاده می‌کنید، می‌توانید در این زمینه نگران کارایی نباشید. - یادآوری شود که با استفاده از تابع ``dir`` می‌توانیم متدها و صفت‌های شی الگو را مشاهده نماییم:: +یادآوری شود که با استفاده از تابع ``dir`` می‌توانیم متدها و صفت‌های شی الگو را مشاهده نماییم:: >>> dir(pattern) # Python 3.x ['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'findall', 'finditer', 'flags', 'fullmatch', 'groupindex', 'groups', 'match', 'pattern', 'scanner', 'search', 'split', 'sub', 'subn'] >>> +توابع جستجو +~~~~~~~~~~~~~~~~~~~~~ + +توابع پرکاربرد ماژول ``re``، مرتبط با عمل جستجو در متن، عبارتند از: ``finditer`` ``findall`` ``fullmatch`` ``match`` ``search`` که در بخش‌های بعدی به شرح هریک پرداخته خواهد شد. + +تابع ``search`` +~~~~~~~~~~~~~~~~~~~~~~ -* ``search(pattern, string, flags=0)`` +``search(pattern, string, flags=0)`` - تابع ``search`` به دنبال اولین انطباق pattern در string می‌گردد، در صورت موفقیت یک شی ``Match`` [`اسناد پایتون `__] و در غیر این صورت ``None`` برمی‌گرداند [`اسناد پایتون `__]:: +تابع ``search`` به دنبال اولین انطباق pattern در string می‌گردد، در صورت موفقیت یک شی ``Match`` [`اسناد پایتون `__] و در غیر این صورت ``None`` برمی‌گرداند [`اسناد پایتون `__]:: >>> # Python 2.x @@ -597,9 +637,7 @@ >>> - - - :: +:: >>> # Python 3.x @@ -612,19 +650,25 @@ - پیش از صحبت در مورد شی ``Match`` اجازه بدهید یاد آوری کنیم که دو نمونه کد زیر عملکردی معادل یکدیگر دارند:: +اجازه بدهید یاد آوری کنیم که دو نمونه کد زیر عملکردی معادل یکدیگر دارند:: + >>> pattern = re.compile('Py...n') >>> match = pattern.search('Python is great') - :: +:: >>> match = re.search('Py...n', 'Python is great') - شی ``Match``:: +شی ``Match`` پایتون +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +:: + >>> pattern = re.compile('Py...n') >>> match = pattern.search('Python is great') >>> >>> if match: @@ -635,80 +679,128 @@ Python >>> - :: +:: >>> dir(match) ['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'end', 'endpos', 'expand', 'group', 'groupdict', 'groups', 'lastgroup', 'lastindex', 'pos', 're', 'regs', 'span', 'start', 'string'] - به دو نمونه کد زیر توجه نمایید:: +در ادامه به بررسی برخی از متدهای مهم این شی می‌پردازیم: + + * ``Match.group([group1, ...])`` [`اسناد پایتون `__] - >>> string = 'python3 python2 python1' - >>> pattern = 'python.' - >>> match = re.search(pattern, string) - >>> - >>> match.group() - 'python3' - >>> match.group(0) - 'python3' - >>> match.group(1) + این متد از شی ``Match`` گروه (های) تطبیق داده شده بر اساس الگو مورد نظر را برمی‌گرداند. این متد می‌تواند یک یا چند آرگومان عددی دریافت کند که معرف اندیس گروه مورد نظر می‌باشد. در حالت فراخوانی بدون آرگومان تمامی گروه‌های تطبیق داده شده به صورت یک مقدار رشته برگردانده می‌شود و در صورتی تنها یک مقدار به آن ارسال گردد، گروه تطبیق داده شده متناظر با آن اندیس (شمارش اندیس‌ها از یک است) در قالب یک شی رشته برگردانده می‌شود و در صورتی که بیش از یک اندیس به عنوان آرگومان ارسال گردد یک شی تاپل محتوی گروه‌های تطبیق داده شده برگردانده خواهد شد. چنانچه آرگومان ارسالی عددی منفی باشد یا اندیسی بالاتر از تعداد گروه‌های تطبیق داده شده باشد، یک استثنا ``IndexError`` رخ خواهد داد:: + + >>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist") + >>> m.group() # The entire match + 'Isaac Newton' + >>> m.group(0) # The entire match + 'Isaac Newton' + >>> m.group(1) # The first parenthesized subgroup. + 'Isaac' + >>> m.group(2) # The second parenthesized subgroup. + 'Newton' + >>> m.group(1, 2) # Multiple arguments give us a tuple. + ('Isaac', 'Newton') + + >>> m.group(3) Traceback (most recent call last): File "", line 1, in IndexError: no such group - >>> - >>> match.groups() - () - >>> - >>> match.start() - 0 - >>> match.end() - 7 - >>> match.span() - (0, 7) - >>> - >>> match.re - re.compile('python.') - >>> - >>> match.string - 'python3 python2 python1' - >>> + * ``Match.groups(default=None)`` [`اسناد پایتون `__] + + این متد از شی ``Match`` تمام گروه‌های تطبیق داده شده بر اساس الگو مورد نظر را در قالب یک شی تاپل برمی‌گرداند. این متد می‌تواند یک آرگومان بپذیرد که معرف مقدار پیش‌فرض برای جایگذاری گروه‌هایی است در درشته ورودی تطبیق داده نشده اند، در حالت عادی (بدون ارسال آرگومان) این مقدار برابر با ``None`` است:: + + >>> m = re.match(r"(\d+)\.(\d+)", "24.1632") + >>> m.groups() + ('24', '1632') + :: - >>> string = '39801 356, 2102 1111' - >>> pattern = '(\d{3}) (\d{2})' - >>> match = re.search(pattern, string) - >>> - >>> match.group() - '801 35' - >>> match.group(0) - '801 35' - >>> match.group(1) - '801' - >>> match.group(2) - '35' - >>> match.group(3) + >>> m = re.match(r"(\d+)\.?(\d+)?", "24") + >>> m.groups() # Second group defaults to None. + ('24', None) + >>> m.groups('0') # Now, the second group defaults to '0'. + ('24', '0') + + * ``Match.start([group])`` [`اسناد پایتون `__] ``Match.end([group])`` [`اسناد پایتون `__] + + متن رشته خروجی (تطبیق یافته بر اساس الگو مورد نظر) را در نظر بگیرید، متد ``start`` اندیس شروع این متن از رشته ورودی و متد ``end`` اندیس نقطه پایان را برمی‌گردانند. این دو متد می‌توانند یک آرگومان اختیاری نیز دریافت کنند که معرف اندیس یک گروه مشخص در الگو می‌باشد، با ارسال این آرگومان نتایج بر اساس تکه متن تطبیق داده شده با آن گروه برگردانده خواهد شد:: + + >>> email = "tony@tiremove_thisger.net" + >>> m = re.search("remove_this", email) + >>> m.start() + 7 + >>> m.end() + 18 + >>> email[m.start() : m.end()] + 'remove_this' + >>> email[:m.start()] + email[m.end():] + 'tony@tiger.net' + + :: + + >>> m = re.match(r"(\d+)\.(\d+)", "24.1632") + + >>> m.start() + 0 + >>> m.end() + 7 + + >>> m.start(1) + 0 + >>> m.end(1) + 2 + + >>> m.start(2) + 3 + >>> m.end(2) + 7 + >>> + + + * ``Match.span([group])`` [`اسناد پایتون `__] + + این متد یک شی تاپل دوتایی از خروجی دو متد ``start`` و ``end`` را بر می‌گرداند ``(m.start(group), m.end(group))`` و همانند آنها یک آرگومان اختیاری دارد:: + + >>> m.span() + (0, 7) + >>> m.span(1) + (0, 2) + >>> m.span(2) + (3, 7) + >>> m.span(3) Traceback (most recent call last): File "", line 1, in IndexError: no such group - >>> - >>> match.groups() - ('801', '35') - >>> - >>> match.start() - 2 - >>> match.end() - 8 - >>> match.span() - (2, 8) - >>> - >>> match.re - re.compile('(\\d{3}) (\\d{2})') - >>> - >>> match.string - '39801 356, 2102 1111' - >>> + + * ``Match.re`` [`اسناد پایتون `__] ``Match.string`` [`اسناد پایتون `__] + + این دو متغیر به ترتیب حاوی شی RegEx الگو و متن ارسال شده به دو متد ``search`` و ``match`` خواهند بود:: + + >>> email = "tony@tiremove_thisger.net" + >>> m = re.search("remove_this", email) + + >>> m.re + re.compile('remove_this') + + >>> m.string + 'tony@tiremove_thisger.net' + >>> m.string[m.start() : m.end()] + 'remove_this' + + :: + + >>> m = re.match(r"(\d+)\.(\d+)", "24.1632") + + >>> m.re + re.compile('(\\d+)\\.(\\d+)') + + >>> m.string + '24.1632' + From 097a79b02fd0675c95a322b74ef6c12b93d1fa74 Mon Sep 17 00:00:00 2001 From: Saeid Date: Tue, 16 Feb 2021 02:40:11 +0330 Subject: [PATCH 009/226] l15: modify match object section --- lessons/l15.rst | 47 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/lessons/l15.rst b/lessons/l15.rst index d15a6a8..54e4686 100644 --- a/lessons/l15.rst +++ b/lessons/l15.rst @@ -529,8 +529,8 @@ در زبان برنامه‌نویسی پایتون از طریق ماژول ``re`` از کتابخانه استاندارد آن، ثابت‌ها (constants) و توابع (functions) کاربردی بسیاری در زمینه عبارت باقاعده فراهم آورده شده است. در ادامه به بررسی برخی این از این توابع و نکات پیرامون آن‌ها خواهیم پرداخت. -تابع ``compile`` و شی RegEx پایتونی -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +تابع ``compile`` و شی Regular Expression پایتون +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``re.compile(pattern, flags=0)`` @@ -615,7 +615,7 @@ توابع جستجو ~~~~~~~~~~~~~~~~~~~~~ -توابع پرکاربرد ماژول ``re``، مرتبط با عمل جستجو در متن، عبارتند از: ``finditer`` ``findall`` ``fullmatch`` ``match`` ``search`` که در بخش‌های بعدی به شرح هریک پرداخته خواهد شد. +توابع پرکاربرد ماژول ``re`` پایتون مرتبط با عمل جستجو در یک متن عبارتند از: ``finditer`` ``findall`` ``fullmatch`` ``match`` ``search`` که در بخش‌های بعدی به شرح هریک پرداخته خواهد شد. تابع ``search`` @@ -650,7 +650,7 @@ -اجازه بدهید یاد آوری کنیم که دو نمونه کد زیر عملکردی معادل یکدیگر دارند:: +اجازه بدهید یادآوری کنیم که دو نمونه کد زیر عملکردی معادل یکدیگر دارند:: >>> pattern = re.compile('Py...n') @@ -689,7 +689,7 @@ * ``Match.group([group1, ...])`` [`اسناد پایتون `__] - این متد از شی ``Match`` گروه (های) تطبیق داده شده بر اساس الگو مورد نظر را برمی‌گرداند. این متد می‌تواند یک یا چند آرگومان عددی دریافت کند که معرف اندیس گروه مورد نظر می‌باشد. در حالت فراخوانی بدون آرگومان تمامی گروه‌های تطبیق داده شده به صورت یک مقدار رشته برگردانده می‌شود و در صورتی تنها یک مقدار به آن ارسال گردد، گروه تطبیق داده شده متناظر با آن اندیس (شمارش اندیس‌ها از یک است) در قالب یک شی رشته برگردانده می‌شود و در صورتی که بیش از یک اندیس به عنوان آرگومان ارسال گردد یک شی تاپل محتوی گروه‌های تطبیق داده شده برگردانده خواهد شد. چنانچه آرگومان ارسالی عددی منفی باشد یا اندیسی بالاتر از تعداد گروه‌های تطبیق داده شده باشد، یک استثنا ``IndexError`` رخ خواهد داد:: + این متد از شی ``Match``، گروه (های) تطبیق داده شده بر اساس الگو مورد نظر را برمی‌گرداند. این متد می‌تواند یک یا چند آرگومان عددی دریافت کند که معرف اندیس گروه مورد نظر می‌باشد. در حالت فراخوانی بدون آرگومان تمامی گروه‌های تطبیق داده شده به صورت یک مقدار رشته برگردانده می‌شود و در صورتی تنها یک مقدار به آن ارسال گردد، گروه تطبیق داده شده متناظر با آن اندیس (شمارش اندیس‌ها از یک است) در قالب یک شی رشته برگردانده می‌شود و در صورتی که بیش از یک اندیس به عنوان آرگومان ارسال گردد یک شی تاپل محتوی گروه‌های تطبیق داده شده برگردانده خواهد شد. چنانچه آرگومان ارسالی عددی منفی باشد یا اندیسی بالاتر از تعداد گروه‌های تطبیق داده شده باشد، یک استثنا ``IndexError`` رخ خواهد داد:: >>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist") >>> m.group() # The entire match @@ -707,11 +707,30 @@ Traceback (most recent call last): File "", line 1, in IndexError: no such group + + در صورتی که الگو مورد نظر شامل هیچ گروهبندی نباشد، فراخوانی بدون آرگومان (یا ارسال آرگومان صفر) این متد، تمام متن تطبیق داده شده را برمی‌گرداند:: + + + >>> pattern = re.compile('Py...n') + >>> match = pattern.search('Python is great') + >>> match.group() + 'Python' + + >>> match.group(0) + 'Python' + + >>> match.group(1) + Traceback (most recent call last): + File "", line 1, in + IndexError: no such group + >>> + + * ``Match.groups(default=None)`` [`اسناد پایتون `__] - این متد از شی ``Match`` تمام گروه‌های تطبیق داده شده بر اساس الگو مورد نظر را در قالب یک شی تاپل برمی‌گرداند. این متد می‌تواند یک آرگومان بپذیرد که معرف مقدار پیش‌فرض برای جایگذاری گروه‌هایی است در درشته ورودی تطبیق داده نشده اند، در حالت عادی (بدون ارسال آرگومان) این مقدار برابر با ``None`` است:: + این متد تمام گروه‌های تطبیق داده شده بر اساس الگو مورد نظر را در قالب یک شی تاپل برمی‌گرداند. این متد می‌تواند یک آرگومان بپذیرد که معرف مقدار پیش‌فرض برای جایگذاری گروه‌هایی است که در رشته ورودی تطبیق داده نشده‌اند، در حالت عادی (بدون ارسال آرگومان) این مقدار برابر با ``None`` است:: >>> m = re.match(r"(\d+)\.(\d+)", "24.1632") >>> m.groups() @@ -724,10 +743,19 @@ ('24', None) >>> m.groups('0') # Now, the second group defaults to '0'. ('24', '0') + + + :: + + >>> pattern = re.compile('Py...n') # The pattern is without grouping + >>> match = pattern.search('Python is great') + >>> match.groups() + () + * ``Match.start([group])`` [`اسناد پایتون `__] ``Match.end([group])`` [`اسناد پایتون `__] - متن رشته خروجی (تطبیق یافته بر اساس الگو مورد نظر) را در نظر بگیرید، متد ``start`` اندیس شروع این متن از رشته ورودی و متد ``end`` اندیس نقطه پایان را برمی‌گردانند. این دو متد می‌توانند یک آرگومان اختیاری نیز دریافت کنند که معرف اندیس یک گروه مشخص در الگو می‌باشد، با ارسال این آرگومان نتایج بر اساس تکه متن تطبیق داده شده با آن گروه برگردانده خواهد شد:: + متن رشته خروجی (تطبیق یافته بر اساس الگو مورد نظر) را در نظر بگیرید، متد ``start`` اندیس شروع این متن از رشته ورودی و متد ``end`` اندیس نقطه پایان را برمی‌گرداند. این دو متد می‌توانند یک آرگومان اختیاری نیز دریافت کنند که معرف اندیس یک گروه مشخص در الگو می‌باشد، با ارسال این آرگومان نتایج بر اساس تکه متن تطبیق داده شده با آن گروه برگردانده خواهد شد:: >>> email = "tony@tiremove_thisger.net" >>> m = re.search("remove_this", email) @@ -763,8 +791,9 @@ * ``Match.span([group])`` [`اسناد پایتون `__] - این متد یک شی تاپل دوتایی از خروجی دو متد ``start`` و ``end`` را بر می‌گرداند ``(m.start(group), m.end(group))`` و همانند آنها یک آرگومان اختیاری دارد:: + این متد یک شی تاپل دوتایی از خروجی دو متد ``start`` و ``end`` را بر می‌گرداند و همانند آنها نیز یک آرگومان اختیاری دارد - نمونه خروجی: ``(m.start(group), m.end(group))``:: + >>> m = re.match(r"(\d+)\.(\d+)", "24.1632") >>> m.span() (0, 7) >>> m.span(1) @@ -778,7 +807,7 @@ * ``Match.re`` [`اسناد پایتون `__] ``Match.string`` [`اسناد پایتون `__] - این دو متغیر به ترتیب حاوی شی RegEx الگو و متن ارسال شده به دو متد ``search`` و ``match`` خواهند بود:: + این دو متغیر به ترتیب حاوی شی RegEx الگو و متن مورد نظر جهت انجام عملیات تطابق خواهند بود:: >>> email = "tony@tiremove_thisger.net" >>> m = re.search("remove_this", email) From 430b48e5115506ebcef29c948f6517850b40c763 Mon Sep 17 00:00:00 2001 From: Saeid Date: Tue, 16 Feb 2021 08:41:00 +0330 Subject: [PATCH 010/226] l15: start Extended Patterns --- lessons/l15.rst | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lessons/l15.rst b/lessons/l15.rst index 54e4686..a2e81b1 100644 --- a/lessons/l15.rst +++ b/lessons/l15.rst @@ -29,7 +29,7 @@ عبارات باقاعده ----------------- -قواعد «عبارات باقاعده» شامل استفاده و چیدمان تعدادی کاراکتر خاص می‌شود که در مجموع معنی یا الگویی را به وجود می‌آورند!. در ادامه در قالب دو دسته Matching Characters و Special Sequences به بررسی این کاراکترها می‌پردازیم. +قواعد «عبارات باقاعده» شامل استفاده و چیدمان تعدادی کاراکتر خاص می‌شود که در مجموع معنی یا الگویی را به وجود می‌آورند!. در ادامه به بررسی این کاراکترها می‌پردازیم. کاراکترهای تطابق (Matching Characters) @@ -519,6 +519,13 @@ تفاوت ``Z\`` و ``$``: در متن‌های چند سطری مشاهده می‌شود به گونه‌ای که ``Z\`` به انتهای کل آن متن و ``$`` به انتهای هر سطر از متن اشاره می‌کنند. + +الگوهای گسترده (Extended Patterns) پایتون +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +ساختارهایی که با یک ``؟)`` شروع و با یک ``(`` پایان می‌یابند که از زبان پرل (Perl) الگوبرداری شده است. در این ساختار نخستین کاراکتر بعد از ``؟`` چگونگی عملکرد آن الگو را مطرح می‌کند. توجه داشته باشید که با وجود پرانتز در این ساختار، جز در یک مورد هیچ یک از انواع این ساختار معنی گروهبندی را نمی‌دهند. این ساختارها عبارتند از: + + ماژول re پایتون From e562a457ddc4600b4a9082e4e6f4f6e954d8dd50 Mon Sep 17 00:00:00 2001 From: Saeid Darvish Date: Wed, 17 Feb 2021 00:09:53 +0330 Subject: [PATCH 011/226] split regex concept in two lessons 15 & 16 --- lessons/l15.rst | 241 ++++++++----------------------------------- lessons/l16.rst | 264 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 307 insertions(+), 198 deletions(-) create mode 100644 lessons/l16.rst diff --git a/lessons/l15.rst b/lessons/l15.rst index a2e81b1..b38bfbc 100644 --- a/lessons/l15.rst +++ b/lessons/l15.rst @@ -5,7 +5,7 @@ :keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, تابع, کتابخانه, پایتون, re -درس ۱۵: کتابخانه استاندارد پایتون: Regular expression در پایتون - re +درس ۱۵: Regular Expression در پایتون - بخش ۱ ============================================================================ **عبارات با قاعده** (**Regular expression**) یا به اختصار **RegEx**، رشته‌ای حاوی کاراکترهایی خاص و با معنی است که در عملیات‌هایی مانند یافتن (find)، جاگذاری (repleace) و اعتبارسنجی (validation) به شدت کاربرد پیدا کرده است. در واقع با استفاده از RegEx می‌توان یک الگو (pattern) برای جستجو در متن یا تطابق آن ایجاد کرد. [`ویکی‌پدیا `__] @@ -519,12 +519,6 @@ تفاوت ``Z\`` و ``$``: در متن‌های چند سطری مشاهده می‌شود به گونه‌ای که ``Z\`` به انتهای کل آن متن و ``$`` به انتهای هر سطر از متن اشاره می‌کنند. - -الگوهای گسترده (Extended Patterns) پایتون -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -ساختارهایی که با یک ``؟)`` شروع و با یک ``(`` پایان می‌یابند که از زبان پرل (Perl) الگوبرداری شده است. در این ساختار نخستین کاراکتر بعد از ``؟`` چگونگی عملکرد آن الگو را مطرح می‌کند. توجه داشته باشید که با وجود پرانتز در این ساختار، جز در یک مورد هیچ یک از انواع این ساختار معنی گروهبندی را نمی‌دهند. این ساختارها عبارتند از: - @@ -619,225 +613,76 @@ ['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'findall', 'finditer', 'flags', 'fullmatch', 'groupindex', 'groups', 'match', 'pattern', 'scanner', 'search', 'split', 'sub', 'subn'] >>> -توابع جستجو -~~~~~~~~~~~~~~~~~~~~~ - -توابع پرکاربرد ماژول ``re`` پایتون مرتبط با عمل جستجو در یک متن عبارتند از: ``finditer`` ``findall`` ``fullmatch`` ``match`` ``search`` که در بخش‌های بعدی به شرح هریک پرداخته خواهد شد. - - -تابع ``search`` -~~~~~~~~~~~~~~~~~~~~~~ - - -``search(pattern, string, flags=0)`` - -تابع ``search`` به دنبال اولین انطباق pattern در string می‌گردد، در صورت موفقیت یک شی ``Match`` [`اسناد پایتون `__] و در غیر این صورت ``None`` برمی‌گرداند [`اسناد پایتون `__]:: - - - >>> # Python 2.x - >>> - >>> import re - >>> - >>> match = re.search('Py...n', 'Python is great') - >>> - >>> type(match) - - >>> - -:: - - - >>> # Python 3.x - >>> - >>> import re - >>> - >>> match = re.search('Py...n', 'Python is great') - >>> - >>> type(match) - - -اجازه بدهید یادآوری کنیم که دو نمونه کد زیر عملکردی معادل یکدیگر دارند:: - - - >>> pattern = re.compile('Py...n') - >>> match = pattern.search('Python is great') - -:: - - >>> match = re.search('Py...n', 'Python is great') - - - -شی ``Match`` پایتون -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - -:: - - >>> pattern = re.compile('Py...n') - >>> match = pattern.search('Python is great') - >>> - >>> if match: - ... print(match.group()) - ... else: - ... print("pattern not found") - ... - Python - >>> - -:: - - >>> dir(match) - ['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'end', 'endpos', 'expand', 'group', 'groupdict', 'groups', 'lastgroup', 'lastindex', 'pos', 're', 'regs', 'span', 'start', 'string'] - -در ادامه به بررسی برخی از متدهای مهم این شی می‌پردازیم: - - - * ``Match.group([group1, ...])`` [`اسناد پایتون `__] - - این متد از شی ``Match``، گروه (های) تطبیق داده شده بر اساس الگو مورد نظر را برمی‌گرداند. این متد می‌تواند یک یا چند آرگومان عددی دریافت کند که معرف اندیس گروه مورد نظر می‌باشد. در حالت فراخوانی بدون آرگومان تمامی گروه‌های تطبیق داده شده به صورت یک مقدار رشته برگردانده می‌شود و در صورتی تنها یک مقدار به آن ارسال گردد، گروه تطبیق داده شده متناظر با آن اندیس (شمارش اندیس‌ها از یک است) در قالب یک شی رشته برگردانده می‌شود و در صورتی که بیش از یک اندیس به عنوان آرگومان ارسال گردد یک شی تاپل محتوی گروه‌های تطبیق داده شده برگردانده خواهد شد. چنانچه آرگومان ارسالی عددی منفی باشد یا اندیسی بالاتر از تعداد گروه‌های تطبیق داده شده باشد، یک استثنا ``IndexError`` رخ خواهد داد:: - - >>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist") - >>> m.group() # The entire match - 'Isaac Newton' - >>> m.group(0) # The entire match - 'Isaac Newton' - >>> m.group(1) # The first parenthesized subgroup. - 'Isaac' - >>> m.group(2) # The second parenthesized subgroup. - 'Newton' - >>> m.group(1, 2) # Multiple arguments give us a tuple. - ('Isaac', 'Newton') - - >>> m.group(3) - Traceback (most recent call last): - File "", line 1, in - IndexError: no such group - - در صورتی که الگو مورد نظر شامل هیچ گروهبندی نباشد، فراخوانی بدون آرگومان (یا ارسال آرگومان صفر) این متد، تمام متن تطبیق داده شده را برمی‌گرداند:: - - - >>> pattern = re.compile('Py...n') - >>> match = pattern.search('Python is great') - >>> match.group() - 'Python' - - >>> match.group(0) - 'Python' - - >>> match.group(1) - Traceback (most recent call last): - File "", line 1, in - IndexError: no such group - >>> - - - - - * ``Match.groups(default=None)`` [`اسناد پایتون `__] - - این متد تمام گروه‌های تطبیق داده شده بر اساس الگو مورد نظر را در قالب یک شی تاپل برمی‌گرداند. این متد می‌تواند یک آرگومان بپذیرد که معرف مقدار پیش‌فرض برای جایگذاری گروه‌هایی است که در رشته ورودی تطبیق داده نشده‌اند، در حالت عادی (بدون ارسال آرگومان) این مقدار برابر با ``None`` است:: + +الگوهای گسترده (Extended Patterns) پایتون +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - >>> m = re.match(r"(\d+)\.(\d+)", "24.1632") - >>> m.groups() - ('24', '1632') +ادامه کار با ماژول ``re`` پایتون به درس بعدی موکول می‌کنیم، در اینجا به عنوان بخش پایانی این درس به بحث پیرامون چگونگی ایجاد ساختار الگو در RegEx پایتون برمی‌گردیم و به معرفی ساختار‌های کاربردی دیگری که توسط این زبان پشتیبانی می‌شود می‌پردازیم. - :: +علاوه بر قواعد مورد بحث در دو بخش ابتدایی این درس، الگو (pattern) در RegEx پایتون می‌تواند شامل ساختارهایی باشد که با یک ``؟)`` شروع و با یک ``(`` پایان می‌یابند - مانند:‌ ``( ?)``. این نوع ساختار از زبان پرل (Perl) الگوبرداری شده است. در این نوع ساختارها نخستین کاراکتر بعد از ``؟`` چگونگی عملکرد آن ساختار در الگو را مطرح می‌کند. توجه داشته باشید که با وجود پرانتز در این ساختارها، جز در یک مورد - هیچ‌کدام از آن‌ها معنی گروهبندی را نمی‌دهند و پرانتز در اینجا صرفا مشخص کننده یک فرمان خاص یا محدوده اثر ساختار می‌باشد. این ساختارها عبارتند از: - >>> m = re.match(r"(\d+)\.?(\d+)?", "24") - >>> m.groups() # Second group defaults to None. - ('24', None) - >>> m.groups('0') # Now, the second group defaults to '0'. - ('24', '0') - - - :: - - >>> pattern = re.compile('Py...n') # The pattern is without grouping - >>> match = pattern.search('Python is great') - >>> match.groups() - () +* ``(aiLmsux?)`` + این ساختار کمک می‌کند که بتوانیم یک یا چند مقدار از پارامتر flags را که پیش‌تر با آن آشنا شدیم (مانند ``re.M`` که در اینجا معادل ``(m?)`` است) را از طریق متن الگو اثر دهیم و نه با ارسال پارامتر - باید توجه داشته باشید که برخلاف زبان پرل نمی‌توان این ساختار را در پایتون به صورت حوزه‌ای و محدود استفاده کرد بلکه همانند ارسال پارامتر، این فرامین به صورت کلی در الگو اثرگذاری خواهند داشت:: - * ``Match.start([group])`` [`اسناد پایتون `__] ``Match.end([group])`` [`اسناد پایتون `__] + (?i)PYTHON PROGRAMING - متن رشته خروجی (تطبیق یافته بر اساس الگو مورد نظر) را در نظر بگیرید، متد ``start`` اندیس شروع این متن از رشته ورودی و متد ``end`` اندیس نقطه پایان را برمی‌گرداند. این دو متد می‌توانند یک آرگومان اختیاری نیز دریافت کنند که معرف اندیس یک گروه مشخص در الگو می‌باشد، با ارسال این آرگومان نتایج بر اساس تکه متن تطبیق داده شده با آن گروه برگردانده خواهد شد:: + The Python Programing Language => 1 Matched ('Python Programing') - >>> email = "tony@tiremove_thisger.net" - >>> m = re.search("remove_this", email) - >>> m.start() - 7 - >>> m.end() - 18 - >>> email[m.start() : m.end()] - 'remove_this' - >>> email[:m.start()] + email[m.end():] - 'tony@tiger.net' + در نمونه کد بالا، وجود ساختار ``(i?)`` باعث نادیده گرفتن حروف کوچک یا بزرگ شده است - همانند ارسال پارامتر ``re.I`` [`regex101@ تست آنلاین `__] :: - >>> m = re.match(r"(\d+)\.(\d+)", "24.1632") + 'a' == re.A (ASCII-only matching) + 'i' == re.I (ignore case) + 'L' == re.L (locale dependent) + 'm' == re.M (multi-line) + 's' == re.S (dot matches all) + 'u' == re.U (Unicode matching) + 'x' == re.X (verbose) - >>> m.start() - 0 - >>> m.end() - 7 + به ضعف این ساختار در محدودسازی در یک حوزه از الگو اشاره شد، از **پایتون نسخه 3.6** به بعد می‌توان از ساختار منعطف‌تر زیر استفاده کرد. - >>> m.start(1) - 0 - >>> m.end(1) - 2 +* ``(...:aiLmsux-imsx?)`` - >>> m.start(2) - 3 - >>> m.end(2) - 7 - >>> + از **پایتون نسخه 3.6** به بعد می‌توان از این ساختار استفاده کرد. با استفاده از این ساختار می‌توان اثربخشی حضور پارامترهای flags را محدود به ناحیه خاصی از الگو کرد به این صورت که این بخش از الگو می‌بایست بعد از کاراکتر ``:`` موجود در ساختار قرار بگیرد:: + ^The (?i:PYTHON PROGRAMMING) Language$ - * ``Match.span([group])`` [`اسناد پایتون `__] + مطابق الگو بالا، مهم نیست بخش ``PYTHON PROGRAMMING`` در متن مورد نظر ما با چه ترتیبی از کوچک یا بزرگ بودن حروف حضور داشته باشد، همین که در جای مناسب خود باشد کافی است. اما دو کلمه ``The`` و ``Language`` می‌بایست عینا حضور داشته باشند: - این متد یک شی تاپل دوتایی از خروجی دو متد ``start`` و ``end`` را بر می‌گرداند و همانند آنها نیز یک آرگومان اختیاری دارد - نمونه خروجی: ``(m.start(group), m.end(group))``:: - - >>> m = re.match(r"(\d+)\.(\d+)", "24.1632") - >>> m.span() - (0, 7) - >>> m.span(1) - (0, 2) - >>> m.span(2) - (3, 7) - >>> m.span(3) - Traceback (most recent call last): - File "", line 1, in - IndexError: no such group + :: + + >>> import re # PYTHON 3.7.3 - * ``Match.re`` [`اسناد پایتون `__] ``Match.string`` [`اسناد پایتون `__] + >>> pattern = re.compile("^The (?i:PYTHON PROGRAMMING) Language$") - این دو متغیر به ترتیب حاوی شی RegEx الگو و متن مورد نظر جهت انجام عملیات تطابق خواهند بود:: + >>> print("YES") if pattern.match("The Python Programming Language") else print("NO") + YES - >>> email = "tony@tiremove_thisger.net" - >>> m = re.search("remove_this", email) + >>> print("YES") if pattern.match("The Python Programming LANGUAGE") else print("NO") + NO - >>> m.re - re.compile('remove_this') + در درس بعدی با تابع ``match`` آشنا خواهید شد. به صورت خلاصه، این تابع مقدار دریافتی را با الگو تطابق می‌دهد و در صورت شکست مقدار ``None‍`` برمی‌گرداند. - >>> m.string - 'tony@tiremove_thisger.net' - >>> m.string[m.start() : m.end()] - 'remove_this' + **قابلیت دیگر این ساختار:** می‌توان با قرار دادن یک کاراکتر ‍ ``-`` قبل از پارمترهای ``i`` ``m`` ``s`` ``x``، اثر بخشی آن‌ها را در حوزه مشخصی از الگو غیرفعال ساخت که البته از **پایتون نسخه 3.7** به بعد، این قابلیت پارامترهای ``u`` ``L`` ``a`` را نیز شامل می‌شود - به نمونه کد زیر توجه نمایید:: - :: + >>> import re # PYTHON 3.7.3 - >>> m = re.match(r"(\d+)\.(\d+)", "24.1632") + >>> pattern = re.compile("^The (?-i:PYTHON PROGRAMMING) Language$", re.I) - >>> m.re - re.compile('(\\d+)\\.(\\d+)') + >>> print("YES") if pattern.match("The PYTHON PROGRAMMING Language") else print("NO") + YES - >>> m.string - '24.1632' + >>> print("YES") if pattern.match("The PYTHON PROGRAMMING LANGUAGE") else print("NO") + YES + >>> print("YES") if pattern.match("THE PYTHON PROGRAMMING LANGUAGE") else print("NO") + YES + >>> print("YES") if pattern.match("THE Python Programming LANGUAGE") else print("NO") + NO diff --git a/lessons/l16.rst b/lessons/l16.rst new file mode 100644 index 0000000..6b0ef45 --- /dev/null +++ b/lessons/l16.rst @@ -0,0 +1,264 @@ +.. role:: emoji-size + +.. meta:: + :description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، آموزش ماژول re در پایتون، عبارات باقاعده در پایتون، Regular expression در پایتون، regex در پایتون + :keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, تابع, کتابخانه, پایتون, re + + +درس ۱۵: Regular Expression در پایتون - بخش ۲ +============================================================================ + +**عبارات با قاعده** (**Regular expression**) یا به اختصار **RegEx**، رشته‌ای حاوی کاراکترهایی خاص و با معنی است که در عملیات‌هایی مانند یافتن (find)، جاگذاری (repleace) و اعتبارسنجی (validation) به شدت کاربرد پیدا کرده است. در واقع با استفاده از RegEx می‌توان یک الگو (pattern) برای جستجو در متن یا تطابق آن ایجاد کرد. [`ویکی‌پدیا `__] + +در این درس به شرح قواعد موجود در RegEx و همچنین ماژول ``re`` از کتابخانه استاندارد پایتون خواهیم پرداخت [`اسناد پایتون `__]. ماژول ``re`` یک مجموعه ابزار برای کار با RegEx در پایتون را فراهم آورده است که می‌توان آن را موتور تحلیل RegEx در پایتون دانست. + + + + + +:emoji-size:`✔` سطح: متوسط + +---- + + +.. contents:: سرفصل‌ها + :depth: 2 + +---- + + + + +توابع جستجو +~~~~~~~~~~~~~~~~~~~~~ + +توابع پرکاربرد ماژول ``re`` پایتون مرتبط با عمل جستجو در یک متن عبارتند از: ``finditer`` ``findall`` ``fullmatch`` ``match`` ``search`` که در بخش‌های بعدی به شرح هریک پرداخته خواهد شد. + + +تابع ``search`` +~~~~~~~~~~~~~~~~~~~~~~ + + +``search(pattern, string, flags=0)`` + +تابع ``search`` به دنبال اولین انطباق pattern در string می‌گردد، در صورت موفقیت یک شی ``Match`` [`اسناد پایتون `__] و در غیر این صورت ``None`` برمی‌گرداند [`اسناد پایتون `__]:: + + + >>> # Python 2.x + >>> + >>> import re + >>> + >>> match = re.search('Py...n', 'Python is great') + >>> + >>> type(match) + + >>> + +:: + + + >>> # Python 3.x + >>> + >>> import re + >>> + >>> match = re.search('Py...n', 'Python is great') + >>> + >>> type(match) + + + +اجازه بدهید یادآوری کنیم که دو نمونه کد زیر عملکردی معادل یکدیگر دارند:: + + + >>> pattern = re.compile('Py...n') + >>> match = pattern.search('Python is great') + +:: + + >>> match = re.search('Py...n', 'Python is great') + + + +شی ``Match`` پایتون +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +:: + + >>> pattern = re.compile('Py...n') + >>> match = pattern.search('Python is great') + >>> + >>> if match: + ... print(match.group()) + ... else: + ... print("pattern not found") + ... + Python + >>> + +:: + + >>> dir(match) + ['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'end', 'endpos', 'expand', 'group', 'groupdict', 'groups', 'lastgroup', 'lastindex', 'pos', 're', 'regs', 'span', 'start', 'string'] + +در ادامه به بررسی برخی از متدهای مهم این شی می‌پردازیم: + + + * ``Match.group([group1, ...])`` [`اسناد پایتون `__] + + این متد از شی ``Match``، گروه (های) تطبیق داده شده بر اساس الگو مورد نظر را برمی‌گرداند. این متد می‌تواند یک یا چند آرگومان عددی دریافت کند که معرف اندیس گروه مورد نظر می‌باشد. در حالت فراخوانی بدون آرگومان تمامی گروه‌های تطبیق داده شده به صورت یک مقدار رشته برگردانده می‌شود و در صورتی تنها یک مقدار به آن ارسال گردد، گروه تطبیق داده شده متناظر با آن اندیس (شمارش اندیس‌ها از یک است) در قالب یک شی رشته برگردانده می‌شود و در صورتی که بیش از یک اندیس به عنوان آرگومان ارسال گردد یک شی تاپل محتوی گروه‌های تطبیق داده شده برگردانده خواهد شد. چنانچه آرگومان ارسالی عددی منفی باشد یا اندیسی بالاتر از تعداد گروه‌های تطبیق داده شده باشد، یک استثنا ``IndexError`` رخ خواهد داد:: + + >>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist") + >>> m.group() # The entire match + 'Isaac Newton' + >>> m.group(0) # The entire match + 'Isaac Newton' + >>> m.group(1) # The first parenthesized subgroup. + 'Isaac' + >>> m.group(2) # The second parenthesized subgroup. + 'Newton' + >>> m.group(1, 2) # Multiple arguments give us a tuple. + ('Isaac', 'Newton') + + >>> m.group(3) + Traceback (most recent call last): + File "", line 1, in + IndexError: no such group + + در صورتی که الگو مورد نظر شامل هیچ گروهبندی نباشد، فراخوانی بدون آرگومان (یا ارسال آرگومان صفر) این متد، تمام متن تطبیق داده شده را برمی‌گرداند:: + + + >>> pattern = re.compile('Py...n') + >>> match = pattern.search('Python is great') + >>> match.group() + 'Python' + + >>> match.group(0) + 'Python' + + >>> match.group(1) + Traceback (most recent call last): + File "", line 1, in + IndexError: no such group + >>> + + + + + * ``Match.groups(default=None)`` [`اسناد پایتون `__] + + این متد تمام گروه‌های تطبیق داده شده بر اساس الگو مورد نظر را در قالب یک شی تاپل برمی‌گرداند. این متد می‌تواند یک آرگومان بپذیرد که معرف مقدار پیش‌فرض برای جایگذاری گروه‌هایی است که در رشته ورودی تطبیق داده نشده‌اند، در حالت عادی (بدون ارسال آرگومان) این مقدار برابر با ``None`` است:: + + >>> m = re.match(r"(\d+)\.(\d+)", "24.1632") + >>> m.groups() + ('24', '1632') + + :: + + >>> m = re.match(r"(\d+)\.?(\d+)?", "24") + >>> m.groups() # Second group defaults to None. + ('24', None) + >>> m.groups('0') # Now, the second group defaults to '0'. + ('24', '0') + + + :: + + >>> pattern = re.compile('Py...n') # The pattern is without grouping + >>> match = pattern.search('Python is great') + >>> match.groups() + () + + + * ``Match.start([group])`` [`اسناد پایتون `__] ``Match.end([group])`` [`اسناد پایتون `__] + + متن رشته خروجی (تطبیق یافته بر اساس الگو مورد نظر) را در نظر بگیرید، متد ``start`` اندیس شروع این متن از رشته ورودی و متد ``end`` اندیس نقطه پایان را برمی‌گرداند. این دو متد می‌توانند یک آرگومان اختیاری نیز دریافت کنند که معرف اندیس یک گروه مشخص در الگو می‌باشد، با ارسال این آرگومان نتایج بر اساس تکه متن تطبیق داده شده با آن گروه برگردانده خواهد شد:: + + >>> email = "tony@tiremove_thisger.net" + >>> m = re.search("remove_this", email) + >>> m.start() + 7 + >>> m.end() + 18 + >>> email[m.start() : m.end()] + 'remove_this' + >>> email[:m.start()] + email[m.end():] + 'tony@tiger.net' + + :: + + >>> m = re.match(r"(\d+)\.(\d+)", "24.1632") + + >>> m.start() + 0 + >>> m.end() + 7 + + >>> m.start(1) + 0 + >>> m.end(1) + 2 + + >>> m.start(2) + 3 + >>> m.end(2) + 7 + >>> + + + * ``Match.span([group])`` [`اسناد پایتون `__] + + این متد یک شی تاپل دوتایی از خروجی دو متد ``start`` و ``end`` را بر می‌گرداند و همانند آنها نیز یک آرگومان اختیاری دارد - نمونه خروجی: ``(m.start(group), m.end(group))``:: + + >>> m = re.match(r"(\d+)\.(\d+)", "24.1632") + >>> m.span() + (0, 7) + >>> m.span(1) + (0, 2) + >>> m.span(2) + (3, 7) + >>> m.span(3) + Traceback (most recent call last): + File "", line 1, in + IndexError: no such group + + * ``Match.re`` [`اسناد پایتون `__] ``Match.string`` [`اسناد پایتون `__] + + این دو متغیر به ترتیب حاوی شی RegEx الگو و متن مورد نظر جهت انجام عملیات تطابق خواهند بود:: + + >>> email = "tony@tiremove_thisger.net" + >>> m = re.search("remove_this", email) + + >>> m.re + re.compile('remove_this') + + >>> m.string + 'tony@tiremove_thisger.net' + >>> m.string[m.start() : m.end()] + 'remove_this' + + :: + + >>> m = re.match(r"(\d+)\.(\d+)", "24.1632") + + >>> m.re + re.compile('(\\d+)\\.(\\d+)') + + >>> m.string + '24.1632' + + + + + + +| + +---- + +:emoji-size:`😊` امیدوارم مفید بوده باشه + +`لطفا دیدگاه و سوال‌های مرتبط با این درس خود را در کدرز مطرح نمایید. `_ + + + From df61384e34e4541bc047a38341c76b2ac0788a7f Mon Sep 17 00:00:00 2001 From: Saeid Darvish Date: Wed, 17 Feb 2021 22:44:52 +0330 Subject: [PATCH 012/226] l15: add some of Extended Patterns --- lessons/l15.rst | 75 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/lessons/l15.rst b/lessons/l15.rst index b38bfbc..f2df0f3 100644 --- a/lessons/l15.rst +++ b/lessons/l15.rst @@ -685,6 +685,81 @@ NO +* گروه بانام (Named Group): ``(...>> import re + >>> string = "NOV 7, 1987" + >>> pattern = "^(\w+)\s(\d+),\s(\d+)$" + >>> match = re.search(pattern, string) + >>> match.group(1) + 'NOV' + >>> match.group(2) + '7' + >>> match.group(3) + '1987' + + :: + + >>> import re + + >>> string = "NOV 7, 1987" + >>> pattern = "^(?P\w+)\s(?P\d+),\s(?P\d+)$" + >>> match = re.search(pattern, string) + + >>> match.group(1) + 'NOV' + >>> match.group(2) + '7' + >>> match.group(3) + '1987' + + >>> match.group('month') + 'NOV' + >>> match.group('day') + '7' + >>> match.group('year') + '1987' + + تابع ``search`` به دنبال اولین انطباق pattern در string می‌گردد، در صورت موفقیت یک شی ``Match`` و در غیر این صورت ``None`` برمی‌گرداند - این تابع و خروجی آن در درس بعدی شرح داده می‌شود. + + +* ``(P=name?)`` + + این ساختار امکان ارجاع به حاصل انطباق یک گروه بانام در آن الگو را فراهم می‌آورد. این ساختار در الگوهایی که می‌بایست دقیقا یک بخش از متن تکرار گردد، بسیار کاربردی است. به نمونه کد زیر توجه نمایید، در این مثال قرار است ایمیل مربوط به دو شخص بررسی شود که آیا بر اساس نام و نام‌خانوادگی آن‌ها ایجاد شده است یا خیر:: + + >>> import re + + >>> strings = ["name family: name.family@mail.com", "diff_name family: name.family@mail.com"] + >>> pattern = "(?P\w+)\s(?P\w+):\s(?P=f_name)\.(?P=l_name)@mail\.com$" + >>> for string in strings: + ... print('STRING:', string) + ... match = re.search(pattern, string) + ... if match: + ... print('Matched:', match.group('f_name'), match.group('l_name')) + ... else: + ... print('No match!') + ... + STRING: name family: name.family@mail.com + Matched: name family + STRING: diff_name family: name.family@mail.com + No match! + + +* توضیحات (Comment) ``(...#?)`` + + همانند توضیح در پایتون، متن موجود در این ساختار، هنگام پردازش الگو نادیده گرفته می‌شود:: + + >>> import re + + >>> pattern = re.compile('^\d{3}:(?#Iran Emergency Numbers)\s\w+\.', re.I) + + >>> print("YES") if pattern.match("115: Ambulance.") else print("NO") + YES + + + | From 469e02e6e3c0762a2ec1837138ea1c93a9c69d15 Mon Sep 17 00:00:00 2001 From: Saeid Darvish Date: Thu, 18 Feb 2021 23:06:57 +0330 Subject: [PATCH 013/226] l15: completed --- lessons/l15.rst | 77 +++++++++++++- lessons/l16.rst | 264 ------------------------------------------------ 2 files changed, 76 insertions(+), 265 deletions(-) delete mode 100644 lessons/l16.rst diff --git a/lessons/l15.rst b/lessons/l15.rst index f2df0f3..14395f9 100644 --- a/lessons/l15.rst +++ b/lessons/l15.rst @@ -758,7 +758,82 @@ >>> print("YES") if pattern.match("115: Ambulance.") else print("NO") YES - + +* Positive Lookahead Assertion ``(...=?)`` + + این ساختار امکان ایجاد شرط مثبت، برای **پیش** از خود را در الگو فراهم می‌آورد. به این صورت که می‌توان انطباق یک متن را منوط به برقرای شرط (انطباق) بعد از آن کرد. آن بخشی از الگو که قبل از این ساختار قرار دارد، تنها زمانی انطباق داده می‌شود که این ساختار منطبق باشد. باید توجه داشت که الگو مشخص شده درون این ساختار (``...``) به عنوان حاصل انطباق برگردانده نخواهد شد و صرفا برای برقرای شرط در الگو حضور خواهد داشت:: + + >>> import re + + >>> pattern = re.compile("(\d{3}\.0)(?=00)") + + >>> print("YES") if pattern.match("115.099") else print("NO") + NO + + >>> print("YES") if pattern.match("115.000") else print("NO") + YES + + >>> match = pattern.search("115.000") + >>> match.group() + '115.0' + + یکی از کاربردهای این ساختار، اعتبارسنجی گذرواژه است. به نمونه کد زیر توجه کنید:: + + + >>> pattern = re.compile("(?=\A\w{6,8}\Z)") + + >>> print("YES") if pattern.match("12345678") else print("NO") + YES + >>> print("YES") if pattern.match("123456") else print("NO") + YES + >>> print("YES") if pattern.match("123") else print("NO") + NO + + در این نمونه کد، از بخش قبل از ساختار صرف نظر شده است و بنابراین حاصل انطباقی نیز در کار نخواهد بود، همچنین با استفاده از دو ‍‍ ``A\`` و ``Z\`` لزوم ابتدا و انتها الگو نیز مشخص شده است. حال به الگو بالا شرط دیگری اضافه می‌کنیم که گذرواژه حداقل شامل یک حرف الفبایی نیز باشد:: + + + >>> pattern = re.compile("(?=\A\w{6,8}\Z)(?=.*[a-zA-Z]+)") + + >>> print("YES") if pattern.match("d2345678") else print("NO") + YES + >>> print("YES") if pattern.match("2345ABcd") else print("NO") + YES + >>> print("YES") if pattern.match("12345678") else print("NO") + NO + + +* Negative Lookahead Assertion ``(...!?)`` + + معکوس حالت قبل است. به این معنی که انطباق یک متن منوط به عدم برقرای شرط (انطباق) **بعد** از آن است. آن بخشی از الگو که قبل از این ساختار قرار دارد، تنها زمانی انطباق داده می‌شود که این ساختار منطبق **نباشد**. + + +* Positive Lookbehind Assertion ``(...=>?)`` + + این ساختار امکان ایجاد شرط مثبت، برای **بعد** از خود را در الگو فراهم می‌آورد. به این صورت که می‌توان انطباق یک متن را منوط به برقرای شرط (انطباق) پیش از آن کرد. آن بخشی از الگو که بعد از این ساختار قرار دارد، تنها زمانی انطباق داده می‌شود که این ساختار منطبق باشد. باید توجه داشت که الگو مشخص شده درون این ساختار (``...``) به عنوان حاصل انطباق برگردانده نخواهد شد و صرفا برای برقرای شرط در الگو حضور خواهد داشت:: + + >>> import re + >>> match = re.search('(?<=abc)def', 'abcdef') + >>> match.group() + >>> 'def' + + +* Negative Lookbehind Assertion ``(...!>?)`` + + معکوس حالت قبل است. به این معنی که انطباق یک متن منوط به عدم برقرای شرط (انطباق) **قبل** از آن است. آن بخشی از الگو که بعد از این ساختار قرار دارد، تنها زمانی انطباق داده می‌شود که این ساختار منطبق **نباشد**. + + +* Yes/No Pattern ``(?(id/name)yes-pattern|no-pattern)`` + + این ساختار نیز نوعی شرط گذاری است. به این صورت که می‌توان تعیین کرد بر اساس وضعیت انطباق گروه‌بندی‌های موجود (با ذکر نام گروه یا شماره اندیس آن) در الگو، یکی از الگوهای بله (yes-pattern) یا خیر (no-pattern) این ساختار بررسی شود:: + + >>> pattern = re.compile('^(###)?foo(?(1)bar|baz)') + + >>> print("YES") if pattern.match("###foobar") else print("NO") + YES + >>> print("YES") if pattern.match("###foobaz") else print("NO") + NO + >>> print("YES") if pattern.match("foobaz") else print("NO") + YES diff --git a/lessons/l16.rst b/lessons/l16.rst deleted file mode 100644 index 6b0ef45..0000000 --- a/lessons/l16.rst +++ /dev/null @@ -1,264 +0,0 @@ -.. role:: emoji-size - -.. meta:: - :description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، آموزش ماژول re در پایتون، عبارات باقاعده در پایتون، Regular expression در پایتون، regex در پایتون - :keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, تابع, کتابخانه, پایتون, re - - -درس ۱۵: Regular Expression در پایتون - بخش ۲ -============================================================================ - -**عبارات با قاعده** (**Regular expression**) یا به اختصار **RegEx**، رشته‌ای حاوی کاراکترهایی خاص و با معنی است که در عملیات‌هایی مانند یافتن (find)، جاگذاری (repleace) و اعتبارسنجی (validation) به شدت کاربرد پیدا کرده است. در واقع با استفاده از RegEx می‌توان یک الگو (pattern) برای جستجو در متن یا تطابق آن ایجاد کرد. [`ویکی‌پدیا `__] - -در این درس به شرح قواعد موجود در RegEx و همچنین ماژول ``re`` از کتابخانه استاندارد پایتون خواهیم پرداخت [`اسناد پایتون `__]. ماژول ``re`` یک مجموعه ابزار برای کار با RegEx در پایتون را فراهم آورده است که می‌توان آن را موتور تحلیل RegEx در پایتون دانست. - - - - - -:emoji-size:`✔` سطح: متوسط - ----- - - -.. contents:: سرفصل‌ها - :depth: 2 - ----- - - - - -توابع جستجو -~~~~~~~~~~~~~~~~~~~~~ - -توابع پرکاربرد ماژول ``re`` پایتون مرتبط با عمل جستجو در یک متن عبارتند از: ``finditer`` ``findall`` ``fullmatch`` ``match`` ``search`` که در بخش‌های بعدی به شرح هریک پرداخته خواهد شد. - - -تابع ``search`` -~~~~~~~~~~~~~~~~~~~~~~ - - -``search(pattern, string, flags=0)`` - -تابع ``search`` به دنبال اولین انطباق pattern در string می‌گردد، در صورت موفقیت یک شی ``Match`` [`اسناد پایتون `__] و در غیر این صورت ``None`` برمی‌گرداند [`اسناد پایتون `__]:: - - - >>> # Python 2.x - >>> - >>> import re - >>> - >>> match = re.search('Py...n', 'Python is great') - >>> - >>> type(match) - - >>> - -:: - - - >>> # Python 3.x - >>> - >>> import re - >>> - >>> match = re.search('Py...n', 'Python is great') - >>> - >>> type(match) - - - -اجازه بدهید یادآوری کنیم که دو نمونه کد زیر عملکردی معادل یکدیگر دارند:: - - - >>> pattern = re.compile('Py...n') - >>> match = pattern.search('Python is great') - -:: - - >>> match = re.search('Py...n', 'Python is great') - - - -شی ``Match`` پایتون -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - -:: - - >>> pattern = re.compile('Py...n') - >>> match = pattern.search('Python is great') - >>> - >>> if match: - ... print(match.group()) - ... else: - ... print("pattern not found") - ... - Python - >>> - -:: - - >>> dir(match) - ['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'end', 'endpos', 'expand', 'group', 'groupdict', 'groups', 'lastgroup', 'lastindex', 'pos', 're', 'regs', 'span', 'start', 'string'] - -در ادامه به بررسی برخی از متدهای مهم این شی می‌پردازیم: - - - * ``Match.group([group1, ...])`` [`اسناد پایتون `__] - - این متد از شی ``Match``، گروه (های) تطبیق داده شده بر اساس الگو مورد نظر را برمی‌گرداند. این متد می‌تواند یک یا چند آرگومان عددی دریافت کند که معرف اندیس گروه مورد نظر می‌باشد. در حالت فراخوانی بدون آرگومان تمامی گروه‌های تطبیق داده شده به صورت یک مقدار رشته برگردانده می‌شود و در صورتی تنها یک مقدار به آن ارسال گردد، گروه تطبیق داده شده متناظر با آن اندیس (شمارش اندیس‌ها از یک است) در قالب یک شی رشته برگردانده می‌شود و در صورتی که بیش از یک اندیس به عنوان آرگومان ارسال گردد یک شی تاپل محتوی گروه‌های تطبیق داده شده برگردانده خواهد شد. چنانچه آرگومان ارسالی عددی منفی باشد یا اندیسی بالاتر از تعداد گروه‌های تطبیق داده شده باشد، یک استثنا ``IndexError`` رخ خواهد داد:: - - >>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist") - >>> m.group() # The entire match - 'Isaac Newton' - >>> m.group(0) # The entire match - 'Isaac Newton' - >>> m.group(1) # The first parenthesized subgroup. - 'Isaac' - >>> m.group(2) # The second parenthesized subgroup. - 'Newton' - >>> m.group(1, 2) # Multiple arguments give us a tuple. - ('Isaac', 'Newton') - - >>> m.group(3) - Traceback (most recent call last): - File "", line 1, in - IndexError: no such group - - در صورتی که الگو مورد نظر شامل هیچ گروهبندی نباشد، فراخوانی بدون آرگومان (یا ارسال آرگومان صفر) این متد، تمام متن تطبیق داده شده را برمی‌گرداند:: - - - >>> pattern = re.compile('Py...n') - >>> match = pattern.search('Python is great') - >>> match.group() - 'Python' - - >>> match.group(0) - 'Python' - - >>> match.group(1) - Traceback (most recent call last): - File "", line 1, in - IndexError: no such group - >>> - - - - - * ``Match.groups(default=None)`` [`اسناد پایتون `__] - - این متد تمام گروه‌های تطبیق داده شده بر اساس الگو مورد نظر را در قالب یک شی تاپل برمی‌گرداند. این متد می‌تواند یک آرگومان بپذیرد که معرف مقدار پیش‌فرض برای جایگذاری گروه‌هایی است که در رشته ورودی تطبیق داده نشده‌اند، در حالت عادی (بدون ارسال آرگومان) این مقدار برابر با ``None`` است:: - - >>> m = re.match(r"(\d+)\.(\d+)", "24.1632") - >>> m.groups() - ('24', '1632') - - :: - - >>> m = re.match(r"(\d+)\.?(\d+)?", "24") - >>> m.groups() # Second group defaults to None. - ('24', None) - >>> m.groups('0') # Now, the second group defaults to '0'. - ('24', '0') - - - :: - - >>> pattern = re.compile('Py...n') # The pattern is without grouping - >>> match = pattern.search('Python is great') - >>> match.groups() - () - - - * ``Match.start([group])`` [`اسناد پایتون `__] ``Match.end([group])`` [`اسناد پایتون `__] - - متن رشته خروجی (تطبیق یافته بر اساس الگو مورد نظر) را در نظر بگیرید، متد ``start`` اندیس شروع این متن از رشته ورودی و متد ``end`` اندیس نقطه پایان را برمی‌گرداند. این دو متد می‌توانند یک آرگومان اختیاری نیز دریافت کنند که معرف اندیس یک گروه مشخص در الگو می‌باشد، با ارسال این آرگومان نتایج بر اساس تکه متن تطبیق داده شده با آن گروه برگردانده خواهد شد:: - - >>> email = "tony@tiremove_thisger.net" - >>> m = re.search("remove_this", email) - >>> m.start() - 7 - >>> m.end() - 18 - >>> email[m.start() : m.end()] - 'remove_this' - >>> email[:m.start()] + email[m.end():] - 'tony@tiger.net' - - :: - - >>> m = re.match(r"(\d+)\.(\d+)", "24.1632") - - >>> m.start() - 0 - >>> m.end() - 7 - - >>> m.start(1) - 0 - >>> m.end(1) - 2 - - >>> m.start(2) - 3 - >>> m.end(2) - 7 - >>> - - - * ``Match.span([group])`` [`اسناد پایتون `__] - - این متد یک شی تاپل دوتایی از خروجی دو متد ``start`` و ``end`` را بر می‌گرداند و همانند آنها نیز یک آرگومان اختیاری دارد - نمونه خروجی: ``(m.start(group), m.end(group))``:: - - >>> m = re.match(r"(\d+)\.(\d+)", "24.1632") - >>> m.span() - (0, 7) - >>> m.span(1) - (0, 2) - >>> m.span(2) - (3, 7) - >>> m.span(3) - Traceback (most recent call last): - File "", line 1, in - IndexError: no such group - - * ``Match.re`` [`اسناد پایتون `__] ``Match.string`` [`اسناد پایتون `__] - - این دو متغیر به ترتیب حاوی شی RegEx الگو و متن مورد نظر جهت انجام عملیات تطابق خواهند بود:: - - >>> email = "tony@tiremove_thisger.net" - >>> m = re.search("remove_this", email) - - >>> m.re - re.compile('remove_this') - - >>> m.string - 'tony@tiremove_thisger.net' - >>> m.string[m.start() : m.end()] - 'remove_this' - - :: - - >>> m = re.match(r"(\d+)\.(\d+)", "24.1632") - - >>> m.re - re.compile('(\\d+)\\.(\\d+)') - - >>> m.string - '24.1632' - - - - - - -| - ----- - -:emoji-size:`😊` امیدوارم مفید بوده باشه - -`لطفا دیدگاه و سوال‌های مرتبط با این درس خود را در کدرز مطرح نمایید. `_ - - - From f52718df2017cd169b088cd24d0e0c3ec660194a Mon Sep 17 00:00:00 2001 From: Saeid Darvish Date: Fri, 19 Feb 2021 13:00:17 +0330 Subject: [PATCH 014/226] l15: edited --- lessons/l15.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lessons/l15.rst b/lessons/l15.rst index 14395f9..173ed11 100644 --- a/lessons/l15.rst +++ b/lessons/l15.rst @@ -527,7 +527,7 @@ آنچه از عبارات باقاعده تاکنون آشنا شدیم تنها شامل تعدادی تعاریف و قواعد بودند که برای استفاده و به کار بردن آنها در زبان‌های برنامه‌نویسی نیاز به ابزارهایی می‌باشد. همچنین باید توجه داشت انجام تمامی امور مربوط به پردازش متن را نباید از عبارات باقاعده انتظار داشت چرا که این قواعد هم محدودیت‌های خاص خود را دارد و در مواردی ممکن است الگوی ایجاد شده چنان پیچیده گردد که از خوانایی برنامه کاسته شود. -در زبان برنامه‌نویسی پایتون از طریق ماژول ``re`` از کتابخانه استاندارد آن، ثابت‌ها (constants) و توابع (functions) کاربردی بسیاری در زمینه عبارت باقاعده فراهم آورده شده است. در ادامه به بررسی برخی این از این توابع و نکات پیرامون آن‌ها خواهیم پرداخت. +در زبان برنامه‌نویسی پایتون از طریق ماژول ``re`` از کتابخانه استاندارد آن، ثابت‌ها (constants) و توابع (functions) کاربردی بسیاری در زمینه عبارت باقاعده فراهم آورده شده است. در ادامه نگاهی کوتاه به این ماژول خواهیم داشت و شرح کامل توابع کاربردی آن به درس بعدی سپرده خواهد شد. تابع ``compile`` و شی Regular Expression پایتون @@ -618,7 +618,7 @@ الگوهای گسترده (Extended Patterns) پایتون ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -ادامه کار با ماژول ``re`` پایتون به درس بعدی موکول می‌کنیم، در اینجا به عنوان بخش پایانی این درس به بحث پیرامون چگونگی ایجاد ساختار الگو در RegEx پایتون برمی‌گردیم و به معرفی ساختار‌های کاربردی دیگری که توسط این زبان پشتیبانی می‌شود می‌پردازیم. +در اینجا به عنوان بخش پایانی این درس به بحث پیرامون چگونگی ایجاد ساختار الگو در RegEx پایتون برمی‌گردیم و به معرفی ساختار‌های کاربردی دیگری که توسط این زبان پشتیبانی می‌شود می‌پردازیم. علاوه بر قواعد مورد بحث در دو بخش ابتدایی این درس، الگو (pattern) در RegEx پایتون می‌تواند شامل ساختارهایی باشد که با یک ``؟)`` شروع و با یک ``(`` پایان می‌یابند - مانند:‌ ``( ?)``. این نوع ساختار از زبان پرل (Perl) الگوبرداری شده است. در این نوع ساختارها نخستین کاراکتر بعد از ``؟`` چگونگی عملکرد آن ساختار در الگو را مطرح می‌کند. توجه داشته باشید که با وجود پرانتز در این ساختارها، جز در یک مورد - هیچ‌کدام از آن‌ها معنی گروهبندی را نمی‌دهند و پرانتز در اینجا صرفا مشخص کننده یک فرمان خاص یا محدوده اثر ساختار می‌باشد. این ساختارها عبارتند از: @@ -666,7 +666,7 @@ در درس بعدی با تابع ``match`` آشنا خواهید شد. به صورت خلاصه، این تابع مقدار دریافتی را با الگو تطابق می‌دهد و در صورت شکست مقدار ``None‍`` برمی‌گرداند. - **قابلیت دیگر این ساختار:** می‌توان با قرار دادن یک کاراکتر ‍ ``-`` قبل از پارمترهای ``i`` ``m`` ``s`` ``x``، اثر بخشی آن‌ها را در حوزه مشخصی از الگو غیرفعال ساخت که البته از **پایتون نسخه 3.7** به بعد، این قابلیت پارامترهای ``u`` ``L`` ``a`` را نیز شامل می‌شود - به نمونه کد زیر توجه نمایید:: + **قابلیت دیگر این ساختار:** می‌توان با قرار دادن یک کاراکتر ‍ ``-`` قبل از پارمترهای ``i`` ``m`` ``s`` ``x``، اثر بخشی آن‌ها را در حوزه مشخصی از الگو غیرفعال ساخت:: >>> import re # PYTHON 3.7.3 From 6e739a40c53d2d84911086653a685f3299ab6621 Mon Sep 17 00:00:00 2001 From: Saeid Darvish Date: Fri, 19 Feb 2021 13:42:09 +0330 Subject: [PATCH 015/226] update: donate & log --- donate-report.rst | 109 ++++++++++++++++++++++++++++++++++++++++++++++ log.rst | 10 +++++ 2 files changed, 119 insertions(+) diff --git a/donate-report.rst b/donate-report.rst index a7c7fab..b027b4c 100644 --- a/donate-report.rst +++ b/donate-report.rst @@ -11,6 +11,8 @@ مبالغ مهم نیستند، از اقدام و پیام تشویق شما دوستان بسیار سپاسگذارم. (*اطلاعات این صفحه به صورت آنی بروز نمی‌شود!*) +**از ابتدا: 1,621,222 تومان** + ---- @@ -22,7 +24,114 @@ +.. raw:: html + +

47: 10,000 تومان در زمان 12:25 23-11-1399
ممنون بایت وقتی که گذاشتین

+ +---- + + +.. raw:: html + +

46: 5,000 تومان در زمان 21:20 13-10-1399
دوست دار عالم

+ +---- + +.. raw:: html + +

45: 5,000 تومان در زمان 14:24 03-06-1399
با سپاس

+ +---- + +.. raw:: html + +

44: 22,222 تومان در زمان 14:24 30-02-1399
لطفا یه راهی پیدا کنید برای گسترش سریعتر مطالب

+ +---- + +.. raw:: html + +

43: 5,000 تومان در زمان 15:03 03-02-1399
دمتون گرم، در حد وسعم کمکی کرده باشم

+ +---- + +.. raw:: html + +

42: 100,000 تومان در زمان 18:54 21-01-1399
ممنون از زحمات شما

+ +---- + +.. raw:: html + +

41: 5,000 تومان در زمان 18:32 13-01-1399
سلام - ممنون از زحمات شما - لطفاً به تلاش خود ادامه دهید

+ +---- + +| + +**سال 1398: 1,298,000 تومان** + +| + + +.. raw:: html + +

40: 10,000 تومان در زمان 15:01 20-12-1398
تشکر از شما بابت جمع آوری این مطالب

+---- + + +.. raw:: html + +

39: 5,000 تومان در زمان 22:15 09-12-1398
ممنونم از زحمات شما ،خوشحال میشم بتونم تو پروژها تون شرکت کنم

+ +---- + + +.. raw:: html + +

38: 5,000 تومان در زمان 01:50 08-12-1398
از زحمات ارزشمند شما ممنونم و آرزوی موفقییت براتون دارم

+ +---- + + + +.. raw:: html + +

37: 10,000 تومان در زمان 17:21 24-11-1398
دمت گرم

+ +---- + +.. raw:: html + +

36: 2,000 تومان در زمان 04:58 22-10-1398
واقعا دمت گرم

+ +---- + +.. raw:: html + +

35: 5,000 تومان در زمان 08:26 07-10-1398
احسنت

+ +---- + +.. raw:: html + +

34: 5,000 تومان در زمان 12:17 05-10-1398
Thanks

+ +---- + +.. raw:: html + +

33: 20,000 تومان در زمان 18:18 11-09-1398
خدا حفظت کنه

+ +---- + + +.. raw:: html + +

32: 10,000 تومان در زمان 12:40 22-08-1398
ممنون از اطلاعات مفید شما

+ +---- .. raw:: html diff --git a/log.rst b/log.rst index e757273..e3bd47f 100644 --- a/log.rst +++ b/log.rst @@ -9,6 +9,16 @@ گزارش توسعه ============= +.. raw:: html + +

00114 - جمعه ۱ اسفند ۱۳۹۹

+ +* درس پانزدهم با عنوان «Regular Expression در پایتون - بخش ۱» به فهرست کتاب افزوده شد. +* گزارش حمایت مالی بروز گردید. + +---- + + .. raw:: html From 4def56fdd9718494b7152de8111011afb1793cbd Mon Sep 17 00:00:00 2001 From: Saeid Darvish Date: Fri, 19 Feb 2021 14:15:26 +0330 Subject: [PATCH 016/226] add coderz link to l15 --- .../sphinx_minoo_theme/includes/header.html | 8 ++++---- .../sphinx_minoo_theme/static/favicon.ico | Bin 0 -> 15086 bytes .../static/{minoo.css => minoo-20210219.css} | 0 lessons/l15.rst | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 _templates/sphinx_minoo_theme/static/favicon.ico rename _templates/sphinx_minoo_theme/static/{minoo.css => minoo-20210219.css} (100%) diff --git a/_templates/sphinx_minoo_theme/includes/header.html b/_templates/sphinx_minoo_theme/includes/header.html index 8eee847..36b3d4a 100644 --- a/_templates/sphinx_minoo_theme/includes/header.html +++ b/_templates/sphinx_minoo_theme/includes/header.html @@ -12,9 +12,9 @@ {% endif %} {%- endblock %} -{% if favicon %} - -{% endif %} + + + {% if not embedded %} {% if use_opensearch %} @@ -36,7 +36,7 @@ {% if theme_direction == "ltr" %} {% else %} - + {% endif %} {%- block linktags %} diff --git a/_templates/sphinx_minoo_theme/static/favicon.ico b/_templates/sphinx_minoo_theme/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c9efc5844a2627a8474949724a2aefe4ab2baee4 GIT binary patch literal 15086 zcmcgz3tUxI_P$#EqsLfjrKaN}rF^8R7zl#$e#lE9E2sH4T54qp=Bv_FY)l=~00C>% zF&`;O=A+c|g@6JoRF;_+O)YUI9mCN{y9!+PeBZujUk}%FFE4Tbe#_&%_nf`g+Uv2` z`qsf@YGS&@bnm?;TsxRvy47UzG?`2tI@mscjPIA>yI#Gt&+aBu=mREG7uBIOT=7iM}d`t)*vk<+$7lLzev?;P$@UuUtE$9x=ZJ;KgrrPHgxHf;L zREU_9LdZFeV2(pVxNCgi_W%&(dJNPKbQg&7bOiZ=o_PKjA=Dgxg=ez*=AT>JE$`gg zj@jqdw%TE%=1U6R#J!xW!>URCi7O}gS(c9T5%?VW>Nz3wa|A&aZ}9Or_~`tNZ9ljt z%@^lQ!To*LPYXKo@tXl+#Y8_5*{AKZiKUl6=Nu!z$J3A{8nUQ4dg|tQDEGHK^6=Tr zP|K&&g2kFQ{6*@Eo>}-VCgJD*t{HRIY8mmbYjXsGkAC1o&7tjQ*tR)?#Ah?Z#3yeB ziPe(_inNzKw}$j?^JmNx1qugI{{bO;PQ4OPVzqFN9^j)BWWo2L+3!Y+FW!j|8|;YSI9)bXCj zMTsr5!o`LeAwuoNl0+Z*Jm(;3a|A`65F!9`cpkQv;rY%5sd2k<7sQGkb0fv(zlIC7 z7t1I3iNBBat~Lkm4d$CEk7yr=h1)ibJz&o9fo%5n-?)JS{IdOncdx59A zfM~N$N6vzn4cliADwBILJy>MIE|$IKYgzP?*FrqRXK&FzeBpMJNs|6c7ynOE_iI-& z)B)rVVtnFAV&JLYP`=DPLL@Ww2Kj)vZ^0mckT<9&s3V9z?*?iDYUtqF%|PzGzWi}| z@BH&ydKUd|?oxEM?2)1h(Z0Y^+B)yDxy9zwS$EC;Gy(TTf*3P8fw->?<>8LNqH~i2 zekd;+@I$5W{=QQ5{jO3xey~Dx`>H~?gNF|LD@5DEa`9k(xwtp?N}1b&ZEs;+?hE$< z8ma$?EwRjuK5iA^N39~rTq&IKFyVNmICZ5;Og&L4?%Pu?+!pR+9Pp7712LB;o%$GK1k=#{*n8zwFa#}{GU}q@i62>^?e`@{a_Cs-@+cWeNgt$dXHS6=UHv{pLR~4 zxd(JVs3oZRs9&mtBM(u~MVMv}dLDX$hpw7Uwkxnu{zpM=L5z)@kMnYV+N9nul#g}B z_gUdAv!(=^KYr7{ zEc1;3@e$5E+!LONGuIUl+=oE;h1`cjHeINF=*;*4-+ZW`T-={`rR?79%VxLK?aX(A zG#Ht@{nd5hm8CY={zf&mYII#nfx8u4%#HfgjE`)vC_ z9-3ueqHR!T?Qkw8ZJRwvY@HP$J_irX7kE}PXTa~#Twn2!0A0KcdrTEx;ev!xp4ZP6-feUiX)|H1k;IkV_JL#0SVlGsf8RVU=5t4DCG5 z)jo9F_Z!d0o`q@gy9yV^iM=U0JxCrLe3EeiKFPSS`t^Z=`R9k@ePvF+IKf-I|H`#| zm^`G6_ArO-J~A^FzB%ZaRfIU`qDS7@kFkEI{TV}(_ov4T2m7 zU8NpS8+`~pEJaPgoPN{lUT|&$K*{7H8R) z7B6TEdG9G(Fz`vn1zmjpXp*u8=m9*~^l*&_u0ITMQu2TtO6|jd!{w}5yMcHHnTpef zPCtyC@JYr6+5*-NYv}qaKL2uPr_67EI~R79fVKTW%=zj)WPFBC z>IZ9S+ga^AJ}*t|Pak9cD}AiK45;}0b77`r;qaDZgZQlFOuG0C8(fVwS%=zvtUf&K zPl*jGNEvLoEw;OA*+P<|uYdSu|7`ZnkE*Z91w0nNE*)cvNXR~}d zJ;;pwdH0&v2NEMqx=_Ie6Y^UhO*}lA4GvxDODi zX*kG^QxIXeaf5ZvZ6MZRtbsa#h*L18u|D+!1%g6AtWWrv-?Mh^4q~lB+=F)9AX~!o zbsglLm?~>HkH^*>oX|7(%-YBD|C86f=yJ&;g_ld*frH4LGT(B#^`1*5EpsoGwD{ue z)@JLDFS}#T`b0d(oXsCZnHdY+K%BR+hveNm+Z^Qk&2PEB-DuV|H!#?8f!Bzq7O9M z_?((I1oyV45{>gYwFn1SjU#P#K5?5+j#B z4a`Bwa5MNHiMm5C12NoqL+PtVH^>gC2<65L4C50RFu|F8h@=?Js_3{N z9Few2eJX1H;u+vvN(Nxitl@5y3|NQpljoRPPhB6xcdQF}zPZZZ{tv(N-X5TVAo>$+ zQjr%i)7r{_=a@4N);+K0sq2*(FERH=L6pNN|Gh1JO#klaM`j{lEhE;-I+nN!F$LBy zcrIeBhWn0&9$3RlTXN6?aRuVg(x-uMFfQqB=?P^^!2cMR^tMC{j(vhw=-DtXv1f8O zVyoMVLupu_Ia41HZA^boH(izx><+xRRMwxsD2d6eMcu(Vm^C2#tav73+^<43R0j4I zoXOA;XPl7?&2YxuvE|o1@DK~4ozceCaNCp=VkW*xY>)UNYiQPw#Ff~qX0I7HM-cax zGW^?yzZ>cS*baT#Q4hr92ja|?_@{#m-KhuUd-Q2T8IWgC2DddwKLj5^pw=L%gN;eS ziL5(`kFu9boS2vtu{qe1O$OKz`Bzx2Ga3G@Y{@_dVr9-`AfD|^hL*6U`)Ny%;SV`i zEDpI+(=D?i%*1hsF%#z|*1iEahLiy~g7gK{@rr*}GO!QfOong`?`xT?h`4k!WwI{QjX8R5iK85jdT=E}4E&+KGPK!qnYQ4oa8TmG#J{8r%8uX*(vA$y1>_VZ z@4z20#}H5?s4h88nD_Ec!=k=BpBar>x;`?r-)rNaJ*GXtQ6-+N^}6T_)ncmdTyT|N z@SQZ`%*%jvv-d)*nY|D8UsUgb{g>3yeNQKk?)%lG_^xxhPM-Tzl=(`rk|9{@2kHGm z*%JGNe7A-E@Nj|T-#b5<7^v2t(J*l%Ur=`BD!*Wk#2y~|SF(pj8PKrlLhH|X%?oSJ0-wxr46ZsWgqLFy1Qv26BM>f;Oc97&g_vIofimy&^f55AX{ z;Y5b{FZ9mq@z#4!>TStU55&i8da%jho_%I5Y_@A*>W~fWPf0t{`a^Z~1*2S>GO%yM zcLQZF6a7^7kM#Xar2}5aMm;(;^5FRo^ggX*(BorD2KOz;lEHt+{pmxdvB$?gBkkyB z`+|~zI`H{u%hP;^r8Y9SFW>Vb_-|R565W%1QuOE`1MCR>T4_fMw3upeE;NQOB#-uB zJPc(|Q!fKCzF^=k?6)gDcz!GUoW!}CflLR|;!C9rv?HzW&i4--&joolyT~u}xwfj= z>f#GvCE^)kOF9`8#;2FTtLS1b?(Gb^9b_s_kDtaqt+XQpU#M+0m}-Jms*MBb@w@8e3#w+*-mzk@%(3p2c4TlasFb4*>^P;)mLkj*rTupuW9>_v#Bk&e+WNxH;9s9#{K8q? z=_0>CeZZWCf5&y*xq2goDa89CD%UQ|cvk$ld#N~CkSTIgpOF|$ed+@3YZTTY9&XRa9M`>(pQQ|`LzdGQBz{rPTpN7_ z^FI=N*^^*C)2RFIO#Zz2(Zg~U#4gX7A6=aNZj>4Li^T}bLw})k{fuBU`XZY$r}!^i z{e~~!qhT)7AihN}g)47^^rcD-HTJtKU^)l}Cj9%FUU`_ +`لطفا دیدگاه و سوال‌های مرتبط با این درس خود را در کدرز مطرح نمایید. `_ From ed6819518a8b3bda1a1778d4ebaa1bf13a0b0d59 Mon Sep 17 00:00:00 2001 From: Saeid Darvish Date: Sat, 20 Feb 2021 22:49:14 +0330 Subject: [PATCH 017/226] update: add some fetures of python 3.8 log#00115 --- donate-report.rst | 10 +++++++++- lessons/l06.rst | 22 ++++++++++++++++++++++ lessons/l09.rst | 9 +++++++++ lessons/l12.rst | 37 +++++++++++++++++++++++++++++++++++-- log.rst | 13 +++++++++++++ 5 files changed, 88 insertions(+), 3 deletions(-) diff --git a/donate-report.rst b/donate-report.rst index b027b4c..dda531e 100644 --- a/donate-report.rst +++ b/donate-report.rst @@ -11,7 +11,7 @@ مبالغ مهم نیستند، از اقدام و پیام تشویق شما دوستان بسیار سپاسگذارم. (*اطلاعات این صفحه به صورت آنی بروز نمی‌شود!*) -**از ابتدا: 1,621,222 تومان** +**از ابتدا (1395): 1,721,222 تومان** ---- @@ -24,6 +24,14 @@ +.. raw:: html + +

48: 100,000 تومان در زمان 09:03 02-12-1399
عالی بود

+ +---- + + + .. raw:: html

47: 10,000 تومان در زمان 12:25 23-11-1399
ممنون بایت وقتی که گذاشتین

diff --git a/lessons/l06.rst b/lessons/l06.rst index 611d93a..6b717bb 100644 --- a/lessons/l06.rst +++ b/lessons/l06.rst @@ -874,6 +874,28 @@ Docstring باید به عنوان دستور نخست درج گردد و این +عملگر‌ شیرماهی (Walrus Operator) +------------------------------------------------------------ + +از نسخه **3.8 پایتون** یک عملگر جدید به نام Assignment Expressions یا Walrus Operator به سینتکس پایتون اضافه شده است. [`PEP 572 `__]. نمایش این عملگر به شکل ``=:`` (شبیه دو چشم و عاج یک شیرماهی! [`تصویر `__]) می‌باشد و به ما این امکان را می‌دهد که عملیات انتساب و بازگرداندن مقدار را به صورت همزمان به انجام برسانیم. به نمونه کد زیر توجه نمایید:: + + >>> walrus = False + >>> print(walrus) + False + +:: + + >>> print(walrus := True) # Python >= 3.8 + True + + >>> walrus + True + +دو نمونه کد بالا عملکرد یکسانی دارند با این تفاوت که در نمونه دوم تنها با استفاده یک سطر کد، متغیر ``walrus`` با انتساب مقدار ``True`` ایجاد و سپس به تابع ``print`` ارسال می‌گردد. + + + + | ---- diff --git a/lessons/l09.rst b/lessons/l09.rst index c0fa5c9..5ed64fc 100644 --- a/lessons/l09.rst +++ b/lessons/l09.rst @@ -109,6 +109,15 @@ Jhon >>> +به مثال دیگری با استفاده از walrus operator (عملگر شیرماهی - درس ششم) و f-string (درس هفتم) توجه نمایید:: + + >>> # Python >= 3.8 + >>> a_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + >>> if (n := len(a_list)) > 5: + ... print(f"List is too long ({n} elements, expected <= 5)") + ... + List is too long (10 elements, expected <= 5) + .. rubric:: ۲. ساختار همراه با ``else`` (دو انتخابی) diff --git a/lessons/l12.rst b/lessons/l12.rst index 2ebc162..1b1f7fe 100644 --- a/lessons/l12.rst +++ b/lessons/l12.rst @@ -732,8 +732,6 @@ File "", line 1 SyntaxError: positional argument follows keyword argument - - :: >>> def f(a, *b, c, d=5): @@ -759,6 +757,24 @@ + در بسط این مبحث لازم است اضافه گردد که می‌توان ارسال آرگومان به برخی پارامترهای یک تابع را ملزم به روش **نام=مقدار** کرد. در این شیوه از کاراکتر ``*`` به عنوان یک پارامتر نشانگر استفاده می‌گردد به این صورت که تمامی پارامترهای بعد از آن تنها می‌بایست به صورت **نام=مقدار** مقداردهی شوند. باید توجه داشت که ``*`` در اینجا پارامتر نبوده و تنها نقش یک نشانگر را دارد:: + + >>> def f(a, *, b, c): + ... print(a, b, c) + ... + >>> f(1, b=2, c=3) + 1 2 3 + + >>> f(1, 2, c=3) + Traceback (most recent call last): + File "", line 1, in + TypeError: f() takes 1 positional argument but 2 positional arguments (and 1 keyword-only argument) were given + + >>> f(1, 2, 3) + Traceback (most recent call last): + File "", line 1, in + TypeError: f() takes 1 positional argument but 3 were given + @@ -810,9 +826,26 @@ 7 14 () {'d': 28, 'c': 21} +* Positional-Only Parameters [`PEP 570 `_] + از **نسخه 3.8 پایتون** سینتکس جدیدی به پایتون اضافه گردیده است که این امکان را به ما می‌دهد تا بتوانیم تعدادی پارامتر را در تعریف یک تابع مجبور به ارسال آرگومان متناظر آن‌ها بر اساس موقعیت نماییم و به بیانی دیگر امکان ارسال آرگومان به روش **نام=مقدار** را برای آن‌ها غیرفعال سازیم. این سینتکس در مواقعی که نام پارامترها در آینده ممکن است دستخوش تغییر شوند، مفید خواهد بود زیرا در این حالت بخش‌های دیگری از کد برنامه نیاز به تغییر نخواهد داشت. + در این سینتکس کافی است در تعریف پارامترهای تابع، پس از نام پارامترهای مورد نظر خود از کاراکتر ``/`` به عنوان یک پارامتر نشانگر استفاده نماییم. در این صورت ارسال آرگومان به روش نام=مقدار برای تمامی پارامترهای پیش از ``/`` ممنوع می‌گردد. باید توجه داشت که ``/`` در اینجا پارامتر نبوده و تنها نقش یک نشانگر را دارد:: + + >>> def f(a, /): + ... print(a) + ... + >>> f(3) + 3 + + >>> f(a=3) + Traceback (most recent call last): + File "", line 1, in + TypeError: f() got some positional-only arguments passed as keyword arguments: 'a' + >>> + .. tip:: + با توضیحات ارائه شده، در یک تابع با سرآیندی همچون ``def f(a, b, /, c, d, *, e, f)`` ارسال آرگومان برای دو پارامتر ``a`` و ``b`` به روش نام=مقدار ممنوع است (positional-only) و ارسال آرگومان برای دو پارامتر ``c`` و ``d`` می‌تواند با استفاده از هر دو روش نام=مقدار یا موقعیت باشد (positional or keyword) و همچنین ارسال آرگومان برای دو پارامتر ``e`` و ``f`` تنها با روش مقدار=نام مجاز خواهد بود (keyword-only). | diff --git a/log.rst b/log.rst index e3bd47f..462c96c 100644 --- a/log.rst +++ b/log.rst @@ -9,6 +9,19 @@ گزارش توسعه ============= +.. raw:: html + +

00115 - شنبه ۲ اسفند ۱۳۹۹

+ +* بروزرسانی - ویژگی **پایتون 3.8:** مبحث Walrus Operator به درس ششم اضافه گردید. +* بروزرسانی - ویژگی **پایتون 3.8:** مبحث Positional-Only Parameters به درس دوازدهم اضافه گردید. +* گزارش حمایت مالی بروز گردید. + +---- + + + + .. raw:: html

00114 - جمعه ۱ اسفند ۱۳۹۹

From 9620746fc320978f130f27e17403bdee8eaf977a Mon Sep 17 00:00:00 2001 From: Saeid Date: Sun, 21 Feb 2021 10:23:05 +0330 Subject: [PATCH 018/226] edit footer --- _templates/sphinx_minoo_theme/includes/bottom.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/_templates/sphinx_minoo_theme/includes/bottom.html b/_templates/sphinx_minoo_theme/includes/bottom.html index c2c530a..07a4e40 100644 --- a/_templates/sphinx_minoo_theme/includes/bottom.html +++ b/_templates/sphinx_minoo_theme/includes/bottom.html @@ -28,6 +28,8 @@

از تلاش برای ایجاد و نگهداری این کتاب حمای حمایت مالی
+
+

این کتاب را با دوستان خود به اشتراک بگذارید

From 2bb6a8ce0a5149a6775931728404dd2a4d6dee84 Mon Sep 17 00:00:00 2001 From: Saeid Darvish Date: Sun, 21 Feb 2021 22:15:35 +0330 Subject: [PATCH 019/226] start l16 --- index.rst | 1 + lessons/l16.rst | 307 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 308 insertions(+) create mode 100644 lessons/l16.rst diff --git a/index.rst b/index.rst index d894484..257125a 100644 --- a/index.rst +++ b/index.rst @@ -30,6 +30,7 @@ lessons/l13 lessons/l14 lessons/l15 + lessons/l16 log donate-report python-interactive diff --git a/lessons/l16.rst b/lessons/l16.rst new file mode 100644 index 0000000..cd37472 --- /dev/null +++ b/lessons/l16.rst @@ -0,0 +1,307 @@ +.. role:: emoji-size + +.. meta:: + :description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، آموزش ماژول re در پایتون، عبارات باقاعده در پایتون، Regular expression در پایتون، regex در پایتون + :keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, تابع, کتابخانه, پایتون, re + + +درس ۱۶: Regular Expression در پایتون - بخش ۲ +============================================================================ + +این درس در ادامه درس قبل (پانزدهم) می‌باشد و به شرح تابع‌های کاربردی موجود در ماژول ``re`` پایتون می‌پردازد. پیش از مطالعه این درس می‌بایست حتما درس قبل را نیز مطالعه کرده باشید. + + + + + +:emoji-size:`✔` سطح: متوسط + +---- + + +.. contents:: سرفصل‌ها + :depth: 2 + +---- + + + + +توابع جستجو +--------------------------------------- + +توابع پرکاربرد ماژول ``re`` پایتون مرتبط با عمل جستجو در یک متن عبارتند از: + +* ``search`` +* ``match`` +* ``fullmatch`` +* ``findall`` +* ``finditer`` + + +تابع ``search`` +~~~~~~~~~~~~~~~~~~~~~~ + + +``search(pattern, string, flags=0)`` + +تابع ``search`` به دنبال اولین انطباق pattern در string می‌گردد، در صورت موفقیت یک شی ``Match`` [`اسناد پایتون `__] و در غیر این صورت ``None`` برمی‌گرداند [`اسناد پایتون `__]:: + + + >>> # Python 2.x + >>> + >>> import re + >>> + >>> match = re.search('Py...n', 'Python is great') + >>> + >>> type(match) + + >>> + +:: + + + >>> # Python 3.x + >>> + >>> import re + >>> + >>> match = re.search('Py...n', 'Python is great') + >>> + >>> type(match) + + + +اجازه بدهید یادآوری کنیم که دو نمونه کد زیر عملکردی معادل یکدیگر دارند:: + + + >>> pattern = re.compile('Py...n') + >>> match = pattern.search('Python is great') + +:: + + >>> match = re.search('Py...n', 'Python is great') + + + +شی ``Match`` پایتون +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +:: + + >>> pattern = re.compile('Py...n') + >>> match = pattern.search('Python is great') + >>> + >>> if match: + ... print(match.group()) + ... else: + ... print("pattern not found") + ... + Python + >>> + +:: + + >>> dir(match) + ['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'end', 'endpos', 'expand', 'group', 'groupdict', 'groups', 'lastgroup', 'lastindex', 'pos', 're', 'regs', 'span', 'start', 'string'] + +در ادامه به بررسی برخی از متدهای مهم این شی می‌پردازیم: + + + * ``Match.group([group1, ...])`` [`اسناد پایتون `__] + + این متد از شی ``Match``، گروه (های) تطبیق داده شده بر اساس الگو مورد نظر را برمی‌گرداند. این متد می‌تواند یک یا چند آرگومان عددی دریافت کند که معرف اندیس گروه مورد نظر می‌باشد. در حالت فراخوانی بدون آرگومان تمامی گروه‌های تطبیق داده شده به صورت یک مقدار رشته برگردانده می‌شود و در صورتی تنها یک مقدار به آن ارسال گردد، گروه تطبیق داده شده متناظر با آن اندیس (شمارش اندیس‌ها از یک است) در قالب یک شی رشته برگردانده می‌شود و در صورتی که بیش از یک اندیس به عنوان آرگومان ارسال گردد یک شی تاپل محتوی گروه‌های تطبیق داده شده برگردانده خواهد شد. چنانچه آرگومان ارسالی عددی منفی باشد یا اندیسی بالاتر از تعداد گروه‌های تطبیق داده شده باشد، یک استثنا ``IndexError`` رخ خواهد داد:: + + >>> match = re.search(r"(\w+) (\w+)", "Isaac Newton, physicist") + >>> match.group() # The entire match + 'Isaac Newton' + >>> match.group(0) # The entire match + 'Isaac Newton' + >>> match.group(1) # The first parenthesized subgroup. + 'Isaac' + >>> match.group(2) # The second parenthesized subgroup. + 'Newton' + >>> match.group(1, 2) # Multiple arguments give us a tuple. + ('Isaac', 'Newton') + + >>> match.group(3) + Traceback (most recent call last): + File "", line 1, in + IndexError: no such group + + در صورتی که الگو مورد نظر شامل هیچ گروهبندی نباشد، فراخوانی بدون آرگومان (یا ارسال آرگومان صفر) این متد، تمام متن تطبیق داده شده را برمی‌گرداند:: + + + >>> pattern = re.compile('Py...n') + >>> match = pattern.search('Python is great') + >>> match.group() + 'Python' + + >>> match.group(0) + 'Python' + + >>> match.group(1) + Traceback (most recent call last): + File "", line 1, in + IndexError: no such group + >>> + + + + + * ``Match.groups(default=None)`` [`اسناد پایتون `__] + + این متد تمام گروه‌های تطبیق داده شده بر اساس الگو مورد نظر را در قالب یک شی تاپل برمی‌گرداند. این متد می‌تواند یک آرگومان بپذیرد که معرف مقدار پیش‌فرض برای جایگذاری گروه‌هایی است که در رشته ورودی تطبیق داده نشده‌اند، در حالت عادی (بدون ارسال آرگومان) این مقدار برابر با ``None`` است:: + + >>> match = re.search("(\d+)\.(\d+)", "24.1632") + >>> match.groups() + ('24', '1632') + + :: + + >>> match = re.search("(\d+)\.?(\d+)?", "24") + >>> match.groups() # Second group defaults to None. + ('24', None) + >>> match.groups('0') # Now, the second group defaults to '0'. + ('24', '0') + + + :: + + >>> pattern = re.compile('Py...n') # The pattern is without grouping + >>> match = pattern.search('Python is great') + >>> match.groups() + () + + + * ``Match.groupdict(default=None)`` [`اسناد پایتون `__] + + این متد یک شی دیکشنری (dict) حاوی حاصل تطابق تمام گروه‌های بانام (Named Groups) موجود در الگو را برمی‌گرداند:: + + + >>> import re + + >>> match = re.search(r"(?P\w+) (?P\w+)", "Elvis Presley") + >>> match.groupdict() + {'first_name': 'Elvis', 'last_name': 'Presley'} + + >>> match.group() + 'Elvis Presley' + >>> match.group(1) + 'Elvis' + >>> match.group(2) + 'Presley' + + >>> match.groups() + ('Elvis', 'Presley') + + این متد نیز همانند متد ``groups`` یک پارامتر اختیاری دارد که در صورت ارسال آرگومان به آن به جای مقدار پیش‌فرض ``None`` برای حاصل عدم تطابق گروه‌های موجود در الگو قرار می‌گیرد:: + + >>> import re + + >>> match = re.search("(?P\w+) (?P`\w+`\s)?(?P\w+)", "Elvis `The King` Presley") + >>> match.groupdict() + {'first_name': 'Elvis', 'nick_name': '`The King` ', 'last_name': 'Presley'} + + >>> match = re.search("(?P\w+) (?P`\w+`\s)?(?P\w+)", "Elvis Presley") + >>> match.groupdict() + {'first_name': 'Elvis', 'nick_name': None, 'last_name': 'Presley'} + + >>> match.groupdict("---") # or match.groupdict(default="---") + {'first_name': 'Elvis', 'nick_name': '---', 'last_name': 'Presley'} + + + + * ``Match.start([group])`` [`اسناد پایتون `__] ``Match.end([group])`` [`اسناد پایتون `__] + + متن رشته خروجی (تطبیق یافته بر اساس الگو مورد نظر) را در نظر بگیرید، متد ``start`` اندیس شروع این متن از رشته ورودی و متد ``end`` اندیس نقطه پایان را برمی‌گرداند. این دو متد می‌توانند یک آرگومان اختیاری نیز دریافت کنند که معرف اندیس یک گروه مشخص در الگو می‌باشد، با ارسال این آرگومان نتایج بر اساس تکه متن تطبیق داده شده با آن گروه برگردانده خواهد شد:: + + >>> email = "tony@tiremove_thisger.net" + >>> match = re.search("remove_this", email) + >>> match.start() + 7 + >>> match.end() + 18 + >>> email[match.start() : match.end()] + 'remove_this' + >>> email[:match.start()] + email[match.end():] + 'tony@tiger.net' + + :: + + >>> match = re.search(r"(\d+)\.(\d+)", "24.1632") + + >>> match.start() + 0 + >>> match.end() + 7 + + >>> match.start(1) + 0 + >>> match.end(1) + 2 + + >>> match.start(2) + 3 + >>> match.end(2) + 7 + >>> + + + * ``Match.span([group])`` [`اسناد پایتون `__] + + این متد یک شی تاپل دوتایی از خروجی دو متد ``start`` و ``end`` را بر می‌گرداند و همانند آنها نیز یک آرگومان اختیاری دارد - نمونه خروجی: ``(m.start(group), m.end(group))``:: + + >>> match = re.search(r"(\d+)\.(\d+)", "24.1632") + >>> match.span() + (0, 7) + >>> match.span(1) + (0, 2) + >>> match.span(2) + (3, 7) + >>> match.span(3) + Traceback (most recent call last): + File "", line 1, in + IndexError: no such group + + * ``Match.re`` [`اسناد پایتون `__] ``Match.string`` [`اسناد پایتون `__] + + این دو متغیر به ترتیب حاوی شی RegEx الگو و متن مورد نظر جهت انجام عملیات تطابق خواهند بود:: + + >>> email = "tony@tiremove_thisger.net" + >>> match = re.search("remove_this", email) + + >>> match.re + re.compile('remove_this') + + >>> match.string + 'tony@tiremove_thisger.net' + + >>> match.string[match.start() : match.end()] + 'remove_this' + + :: + + >>> match = re.search(r"(\d+)\.(\d+)", "24.1632") + + >>> match.re + re.compile('(\\d+)\\.(\\d+)') + + >>> match.string + '24.1632' + + + + + + +| + +---- + +:emoji-size:`😊` امیدوارم مفید بوده باشه + +`لطفا دیدگاه و سوال‌های مرتبط با این درس خود را در کدرز مطرح نمایید. `_ + + + From ecadc2b3b97ab5adea7f6228626d18f2495d007e Mon Sep 17 00:00:00 2001 From: Saeid Date: Mon, 22 Feb 2021 14:43:38 +0330 Subject: [PATCH 020/226] add paypin donate --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..0b044a9 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +custom: ['https://payping.ir/@saeiddrv'] \ No newline at end of file From 7b5cb6dca664f6f5e545f06311f7f4c692f0d169 Mon Sep 17 00:00:00 2001 From: Saeid Darvish Date: Mon, 22 Feb 2021 21:41:18 +0330 Subject: [PATCH 021/226] l16: compelete match object section --- lessons/l16.rst | 53 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/lessons/l16.rst b/lessons/l16.rst index cd37472..26b74c0 100644 --- a/lessons/l16.rst +++ b/lessons/l16.rst @@ -112,7 +112,7 @@ این متد از شی ``Match``، گروه (های) تطبیق داده شده بر اساس الگو مورد نظر را برمی‌گرداند. این متد می‌تواند یک یا چند آرگومان عددی دریافت کند که معرف اندیس گروه مورد نظر می‌باشد. در حالت فراخوانی بدون آرگومان تمامی گروه‌های تطبیق داده شده به صورت یک مقدار رشته برگردانده می‌شود و در صورتی تنها یک مقدار به آن ارسال گردد، گروه تطبیق داده شده متناظر با آن اندیس (شمارش اندیس‌ها از یک است) در قالب یک شی رشته برگردانده می‌شود و در صورتی که بیش از یک اندیس به عنوان آرگومان ارسال گردد یک شی تاپل محتوی گروه‌های تطبیق داده شده برگردانده خواهد شد. چنانچه آرگومان ارسالی عددی منفی باشد یا اندیسی بالاتر از تعداد گروه‌های تطبیق داده شده باشد، یک استثنا ``IndexError`` رخ خواهد داد:: - >>> match = re.search(r"(\w+) (\w+)", "Isaac Newton, physicist") + >>> match = re.search("(\w+) (\w+)", "Isaac Newton, physicist") >>> match.group() # The entire match 'Isaac Newton' >>> match.group(0) # The entire match @@ -181,7 +181,7 @@ >>> import re - >>> match = re.search(r"(?P\w+) (?P\w+)", "Elvis Presley") + >>> match = re.search("(?P\w+) (?P\w+)", "Elvis Presley") >>> match.groupdict() {'first_name': 'Elvis', 'last_name': 'Presley'} @@ -212,6 +212,49 @@ + * ``Match.expand(template)`` [`اسناد پایتون `__] + + این متد حاصل انطباق را در قالب ``template`` جایگذاری کرده و یک شی رشته جدید برمی‌گرداند. قالب در اینجا یک رشته است که در آن می‌توان به حاصل انطباق گروهبندی‌های موجود در الگو ارجاع داد به این صورت کرد که می‌توان گروه‌های بی‌نام موجود در الگو را با استفاده از ارجاع عددی به شماره اندیس آن‌ها به مانند ``1\``، ``2\`` و گروه‌های بانام را با استفاده از نام گروه به مانند ``>> import re + + >>> match = re.search('(\w+),(\w+),(\w+)', 'Jazz,Rock,Pop') + >>> match.groups() + ('Jazz', 'Rock', 'Pop') + + >>> match.expand('-->\1---->\2------>\3') # Wrong result!!! + '-->\x01---->\x02------>\x03' + + >>> match.expand('-->\\1---->\\2------>\\3') + '-->Jazz---->Rock------>Pop' + + >>> match.expand(r'-->\1---->\2------>\3') + '-->Jazz---->Rock------>Pop' + + + .. note:: + در نمونه کد بالا، خروجی نخستین استفاده از متد ``expand`` متناسب با انتظار نیست، دلیل هم مربوط به وجود کاراکترهایی با ``\`` است (escape characters) که باعث بروز اخلال در تحلیل رشته قالب شده است. بهتر است همیشه در این مواقع از قوانین **raw string** پیروی نماییم: استفاده از ``\\`` به جای ``\`` (همانند ``n\\``) یا قرار دادن یک کاراکتر ``r`` یا ``R`` در ابتدای رشته (همانند ``'r'\n``). در این صورت کاراکترهایی همچون newline یا ``n\`` در رشته، معنای خود را از دست می‌دهند. (یادآوری از درس هفتم) + + + .. tip:: + بلای Backslash [`اسناد پایتون `__] + + همیشه در هنگام کار با RegEx (نه فقط در زبان پایتون!) مواظب escape characters یا backslash characters باشید. + + :: + + >>> match = re.search('(?P\d+)', 'Top 100 songs') + >>> match.group(1) + '100' + + >>> match.expand('--- \g ---') + '--- 100 ---' + >>> match.expand('--- \g<1> ---') + '--- 100 ---' + + + + * ``Match.start([group])`` [`اسناد پایتون `__] ``Match.end([group])`` [`اسناد پایتون `__] متن رشته خروجی (تطبیق یافته بر اساس الگو مورد نظر) را در نظر بگیرید، متد ``start`` اندیس شروع این متن از رشته ورودی و متد ``end`` اندیس نقطه پایان را برمی‌گرداند. این دو متد می‌توانند یک آرگومان اختیاری نیز دریافت کنند که معرف اندیس یک گروه مشخص در الگو می‌باشد، با ارسال این آرگومان نتایج بر اساس تکه متن تطبیق داده شده با آن گروه برگردانده خواهد شد:: @@ -229,7 +272,7 @@ :: - >>> match = re.search(r"(\d+)\.(\d+)", "24.1632") + >>> match = re.search("(\d+)\.(\d+)", "24.1632") >>> match.start() 0 @@ -252,7 +295,7 @@ این متد یک شی تاپل دوتایی از خروجی دو متد ``start`` و ``end`` را بر می‌گرداند و همانند آنها نیز یک آرگومان اختیاری دارد - نمونه خروجی: ``(m.start(group), m.end(group))``:: - >>> match = re.search(r"(\d+)\.(\d+)", "24.1632") + >>> match = re.search("(\d+)\.(\d+)", "24.1632") >>> match.span() (0, 7) >>> match.span(1) @@ -282,7 +325,7 @@ :: - >>> match = re.search(r"(\d+)\.(\d+)", "24.1632") + >>> match = re.search("(\d+)\.(\d+)", "24.1632") >>> match.re re.compile('(\\d+)\\.(\\d+)') From babe8957ec80468e4ade37b7afa606de40cc0082 Mon Sep 17 00:00:00 2001 From: Saeid Darvish Date: Tue, 23 Feb 2021 23:00:30 +0330 Subject: [PATCH 022/226] l16: compelete match & fullmatch functions --- lessons/l16.rst | 139 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 131 insertions(+), 8 deletions(-) diff --git a/lessons/l16.rst b/lessons/l16.rst index 26b74c0..d549322 100644 --- a/lessons/l16.rst +++ b/lessons/l16.rst @@ -222,7 +222,7 @@ >>> match.groups() ('Jazz', 'Rock', 'Pop') - >>> match.expand('-->\1---->\2------>\3') # Wrong result!!! + >>> match.expand('-->\1---->\2------>\3') # Warning!!! '-->\x01---->\x02------>\x03' >>> match.expand('-->\\1---->\\2------>\\3') @@ -232,24 +232,34 @@ '-->Jazz---->Rock------>Pop' + :: + + # \1, \2 and \3 are all valid escape characters + + \1 # (U+0001 or 0x01) stands for the ascii start-of-heading character + \2 # (U+0002 or 0x02) stands for the ascii start-of-text character + \3 # (U+0003 or 0x03) stands for the ascii end-of-text character + .. note:: در نمونه کد بالا، خروجی نخستین استفاده از متد ``expand`` متناسب با انتظار نیست، دلیل هم مربوط به وجود کاراکترهایی با ``\`` است (escape characters) که باعث بروز اخلال در تحلیل رشته قالب شده است. بهتر است همیشه در این مواقع از قوانین **raw string** پیروی نماییم: استفاده از ``\\`` به جای ``\`` (همانند ``n\\``) یا قرار دادن یک کاراکتر ``r`` یا ``R`` در ابتدای رشته (همانند ``'r'\n``). در این صورت کاراکترهایی همچون newline یا ``n\`` در رشته، معنای خود را از دست می‌دهند. (یادآوری از درس هفتم) + در واقع مفسر پایتون پیش از قراردادن متن مورد نظر ما در قالب یک شی رشته (string) در حافظه (memory) آن را تحلیل و مقادیر متناسب با کاراکترهای ``\`` را در آن جایگذاری می‌کند که این کار ممکن است در هنگام استفاده ماژول ``re`` از آن شی رشته اخلال ایجاد کند. استفاده از **raw string** باعث می‌شود مفسر پایتون متن مورد نظر را بدون تغییر در حافطه قرار دهد. + .. tip:: بلای Backslash [`اسناد پایتون `__] - همیشه در هنگام کار با RegEx (نه فقط در زبان پایتون!) مواظب escape characters یا backslash characters باشید. + همیشه در هنگام کار با RegEx (نه فقط در زبان پایتون!) مواظب escape characters یا همان backslash characters باشید. تا این لحظه برای جلوگیری از پیچیدگی در مثال‌های ارائه شده مبحث RegEx از قرار دادن **raw string** صرف نظر شده بود اما از آنجا که الگوهای RegEx پر از ``\`` است همواره می‌بایست به لزوم استفاده از **raw string** فکر کنیم. :: - >>> match = re.search('(?P\d+)', 'Top 100 songs') + >>> match = re.search(r'(?P\d+)', 'Top 100 songs') >>> match.group(1) '100' - >>> match.expand('--- \g ---') + >>> match.expand(r'--- \g ---') '--- 100 ---' - >>> match.expand('--- \g<1> ---') + >>> match.expand(r'--- \g<1> ---') '--- 100 ---' @@ -272,7 +282,7 @@ :: - >>> match = re.search("(\d+)\.(\d+)", "24.1632") + >>> match = re.search(r"(\d+)\.(\d+)", "24.1632") >>> match.start() 0 @@ -295,7 +305,7 @@ این متد یک شی تاپل دوتایی از خروجی دو متد ``start`` و ``end`` را بر می‌گرداند و همانند آنها نیز یک آرگومان اختیاری دارد - نمونه خروجی: ``(m.start(group), m.end(group))``:: - >>> match = re.search("(\d+)\.(\d+)", "24.1632") + >>> match = re.search(r"(\d+)\.(\d+)", "24.1632") >>> match.span() (0, 7) >>> match.span(1) @@ -325,7 +335,7 @@ :: - >>> match = re.search("(\d+)\.(\d+)", "24.1632") + >>> match = re.search(r"(\d+)\.(\d+)", "24.1632") >>> match.re re.compile('(\\d+)\\.(\\d+)') @@ -334,7 +344,120 @@ '24.1632' +تابع ``match`` +~~~~~~~~~~~~~~~~~~~~~~ + + +``match(pattern, string, flags=0)`` + +تابع ``match`` از ابتدای string انطباق pattern را انجام می‌دهد، در صورت موفقیت یک شی ``Match`` و در غیر این صورت ``None`` برمی‌گرداند [`اسناد پایتون `__]:: + + >>> import re # Python 3.x + + >>> match = re.match(r'\d+', '123@USERNAME') + >>> print(match) + + + >>> match = re.match(r'\d+', 'USERNAME@123') + >>> print(match) + None + + + >>> match = re.search(r'\d+', '123@USERNAME') + >>> print(match) + + + >>> match = re.search(r'\d+', 'USERNAME@123') + >>> print(match) + + + +.. tip:: + + تفاوت دو تابع ``match`` و ``search`` [`اسناد پایتون `__]: + + هنگام استفاده از تابع ``match``، از همان ابتدای متن مورد نظر می‌بایست با الگو تطابق صورت پذیرد (حتی در متن‌های چند سطری) ولی تابع ``search`` انجام انطباق را در هر جایی از متن دنبال می‌کند. + + هنگام استفاده از نشانه ``re.MULTILINE`` در تابع ``search``، کاراکتر ``^`` در الگو از معنای **ابتدای متن** به معنای **ابتدای هر سطر** تغییر می‌کند ولی از نظر تابع ``match`` وجود کاراکتر ``^`` در الگو همواره به معنی ابتدای متن می‌باشد (نه هر سطر):: + + >>> import re + >>> string = 'Perl\nPython\nRuby' # 3 lines + + >>> match = re.search('^Perl', string) + >>> print(match) + + + >>> match = re.search('^Python', string) + >>> print(match) + None + + >>> match = re.search('^Python', string, re.MULTILINE) + >>> print(match) + + + + >>> match = re.match('^Perl', string) + >>> print(match) + + + >>> match = re.match('^Python', string, re.MULTILINE) + >>> print(match) + None + + +اجازه بدهید یادآوری کنیم که دو نمونه کد زیر عملکردی معادل یکدیگر دارند:: + + + >>> pattern = re.compile('Py...n') + >>> match = pattern.match('Python is great') + +:: + + >>> match = re.match('Py...n', 'Python is great') + + +تابع ``fullmatch`` +~~~~~~~~~~~~~~~~~~~~~~ + + +``fullmatch(pattern, string, flags=0)`` + +این تابع (``fullmatch``) چنانچه تمام string با pattern انطباق داشته باشد یک شی ``Match`` و در غیر این صورت ``None`` برمی‌گرداند [`اسناد پایتون `__] - این تابع از **پایتون نسخه 3.4** به بعد در دسترس است:: + + >>> import re # Python >= 3.4 + + >>> match = re.fullmatch(r'\d+', '123@USERNAME') + >>> print(match) + None + + >>> match = re.fullmatch(r'\d+', '123') + >>> print(match) + + +**عملکرد نمونه کدهای زیر برابر هم هستند - به الگو و نام توابع توجه نمایید**:: + + >>> match = re.search(r'^\d+$', '123') + >>> print(match) + + + >>> match = re.match(r'\d+$', '123') + >>> print(match) + + + >>> match = re.fullmatch(r'\d+', '123') + >>> print(match) + + + +همچنین باید یادآوری کنیم که دو نمونه کد زیر عملکردی معادل یکدیگر دارند:: + + + >>> pattern = re.compile('Py...n') + >>> match = pattern.fullmatch('Python') + +:: + >>> match = re.fullmatch('Py...n', 'Python') From 1faa81f31bca56cd8c14590960d29a354f264c94 Mon Sep 17 00:00:00 2001 From: Saeid Darvish Date: Tue, 23 Feb 2021 23:13:37 +0330 Subject: [PATCH 023/226] add github button --- _templates/sphinx_minoo_theme/includes/header.html | 2 ++ _templates/sphinx_minoo_theme/includes/top.html | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/_templates/sphinx_minoo_theme/includes/header.html b/_templates/sphinx_minoo_theme/includes/header.html index 36b3d4a..d0b02d8 100644 --- a/_templates/sphinx_minoo_theme/includes/header.html +++ b/_templates/sphinx_minoo_theme/includes/header.html @@ -99,3 +99,5 @@ + + diff --git a/_templates/sphinx_minoo_theme/includes/top.html b/_templates/sphinx_minoo_theme/includes/top.html index f4e8dd6..cbeb268 100644 --- a/_templates/sphinx_minoo_theme/includes/top.html +++ b/_templates/sphinx_minoo_theme/includes/top.html @@ -39,6 +39,10 @@
+