Skip to content

Commit f14f770

Browse files
author
Saeid Darvish
committed
l16: completed
1 parent c8428a1 commit f14f770

2 files changed

Lines changed: 178 additions & 14 deletions

File tree

lessons/l15.rst

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -726,6 +726,39 @@
726726
NO
727727

728728

729+
* پرانتزگذاری غیرقابل پیگیری (non-capturing): ``(...:?)``
730+
731+
این ساختار نمایش پرانتزگذاری یا همان گروه‌بندی معمولی در بحث RegEx است ولی با این تفاوت که نتایج انطباق داخل پرانتز قابل بازیابی (همانند یک گروه معمولی) نخواهد بود::
732+
733+
>>> import re
734+
735+
>>> string = "Python@1991"
736+
>>> pattern = "(\d+)"
737+
>>> match = re.search(pattern, string)
738+
739+
>>> match
740+
<re.Match object; span=(7, 11), match='1991'>
741+
742+
>>> match.group(1)
743+
'1991'
744+
745+
::
746+
747+
>>> import re
748+
749+
>>> string = "Python@1991"
750+
>>> pattern = "(?:\d+)"
751+
>>> match = re.search(pattern, string)
752+
753+
>>> match
754+
<re.Match object; span=(7, 11), match='1991'>
755+
756+
>>> match.group(1)
757+
Traceback (most recent call last):
758+
File "<stdin>", line 1, in <module>
759+
IndexError: no such group
760+
761+
729762
* گروه بانام (Named Group): ``(...<P<name?)``
730763

731764
این ساختار نمایش همان گروه‌بندی عادی در بحث RegEx است با این تفاوت که می‌توان به هر گروه یک نام انتساب داد. به کمک ماژول re پایتون، همانطوری که در درس بعدی به صورت کامل خواهید دید، حاصل انطباق هر گروه موجود در الگو با متن مورد نظر از طریق یک اندیس عددی که به ترتیب از یک شروع می‌شود قابل دسترسی است، با استفاده از این ساختار می‌توان حاصل انطباق را بسیار خواناتر و تنها با استفاده از نام آن دستیابی نمود::

lessons/l16.rst

Lines changed: 145 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
.. role:: emoji-size
22

33
.. meta::
4-
:description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، آموزش ماژول re در پایتون، عبارات باقاعده در پایتون، Regular expression در پایتون، regex در پایتون
4+
:description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، آموزش ماژول re در پایتون، عبارات باقاعده در پایتون، Regular expression در پایتون، regex در پایتون، توابع ماژول re پایتون -
55
:keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, تابع, کتابخانه, پایتون, re
66

77

@@ -129,7 +129,7 @@
129129
File "<stdin>", line 1, in <module>
130130
IndexError: no such group
131131

132-
در صورتی که الگو مورد نظر شامل هیچ گروهبندی نباشد، فراخوانی بدون آرگومان (یا ارسال آرگومان صفر) این متد، تمام متن تطبیق داده شده را برمی‌گرداند::
132+
فراخوانی بدون آرگومان (یا ارسال آرگومان صفر - مقدار پیش‌فرض) این متد، تمام متن تطبیق داده شده را برمی‌گرداند::
133133
134134
135135
>>> pattern = re.compile('Py...n')
@@ -139,13 +139,6 @@
139139
140140
>>> match.group(0)
141141
'Python'
142-
143-
>>> match.group(1)
144-
Traceback (most recent call last):
145-
File "<stdin>", line 1, in <module>
146-
IndexError: no such group
147-
>>>
148-
149142

150143

151144

@@ -214,7 +207,7 @@
214207

215208
* ``Match.expand(template)`` [`اسناد پایتون <https://docs.python.org/3/library/re.html#re.Match.expand>`__]
216209

217-
این متد حاصل انطباق را در قالب ``template`` جایگذاری کرده و یک شی رشته جدید برمی‌گرداند. قالب در اینجا یک رشته است که در آن می‌توان به حاصل انطباق گروهبندی‌های موجود در الگو ارجاع داد به این صورت کرد که می‌توان گروه‌های بی‌نام موجود در الگو را با استفاده از ارجاع عددی به شماره اندیس آن‌ها به مانند ``1\``، ``2\`` و گروه‌های بانام را با استفاده از نام گروه به مانند ``<g<name\`` یا ``<g<1\`` در قالب موجود جایگذاری کرد. Escape character‌های موجود در قالب به کاراکترهای مناسب خود در متن خروجی تبدیل می‌شوند و از **نسخه 3.5 پایتون** گروه‌هایی که هیچ انطباقی نداشته‌اند با هیچی (empty string) جایگذاری می‌شوند::
210+
این متد حاصل انطباق را در قالب ``template`` جایگذاری کرده و یک شی رشته جدید برمی‌گرداند. قالب در اینجا یک رشته است که در آن می‌توان به حاصل انطباق گروهبندی‌های موجود در الگو ارجاع داد به این صورت کرد که می‌توان گروه‌های بی‌نام موجود در الگو را با استفاده از ارجاع عددی به شماره اندیس آن‌ها به مانند ``1\``، ``2\`` یا ``<g<1\`` و گروه‌های بانام را با استفاده از نام گروه به مانند ``<g<name\`` در قالب موجود جایگذاری کرد. Escape character‌های موجود در قالب به کاراکترهای مناسب خود در متن خروجی تبدیل می‌شوند و از **نسخه 3.5 پایتون** گروه‌هایی که هیچ انطباقی نداشته‌اند با هیچی (empty string) جایگذاری می‌شوند::
218211

219212
>>> import re
220213

@@ -376,9 +369,9 @@
376369

377370
تفاوت دو تابع ``match`` و ``search`` [`اسناد پایتون <https://docs.python.org/3/library/re.html#search-vs-match>`__]:
378371

379-
هنگام استفاده از تابع ``match``، از همان ابتدای متن مورد نظر می‌بایست با الگو تطابق صورت پذیرد (حتی در متن‌های چند سطری) ولی تابع ``search`` انجام انطباق را در هر جایی از متن دنبال می‌کند.
372+
هنگام استفاده از تابع ``match``، از همان ابتدای متن مورد نظر، می‌بایست تطابق با الگو صورت پذیرد (حتی در متن‌های چند سطری) ولی تابع ``search`` انجام انطباق را در هر جایی از متن دنبال می‌کند.
380373

381-
هنگام استفاده از نشانه ``re.MULTILINE`` در تابع ``search``، کاراکتر ``^`` در الگو از معنای **ابتدای متن** به معنای **ابتدای هر سطر** تغییر می‌کند ولی از نظر تابع ``match`` وجود کاراکتر ``^`` در الگو همواره به معنی ابتدای متن می‌باشد (نه هر سطر)::
374+
هنگام استفاده از نشانه ``re.MULTILINE`` در تابع ``search``، کاراکتر ``^`` در الگو از معنای **ابتدای متن** به معنای **ابتدای هر سطر** تغییر می‌کند (درس قبل) ولی از نظر تابع ``match`` وجود کاراکتر ``^`` در الگو همواره به معنی ابتدای متن می‌باشد (نه هر سطر)::
382375

383376
>>> import re
384377
>>> string = 'Perl\nPython\nRuby' # 3 lines
@@ -589,7 +582,7 @@
589582

590583
``sub(pattern, repl, string, count=0, flags=0)``
591584

592-
این تابع (``sub``) حاصل انطباق‌های ممکن pattern در string را در repl جایگذاری می‌کند. این تابع همچنین دو پارامتر اختیاری دارد (flags و count)، پیش‌تر در مورد flags صحبت کردیم و count نیز بیانگر ماکزیمم تعداد انطباقی است که می‌خواهیم در repl جایگذاری شود - این مقدار می‌بایست یک عدد مثبت باشد و مقدار صفر (مقدار پیش‌فرض) برای آن به معنی هر تعداد (نامحدود) خواهد بود. پارامتر repl در این تابع می‌تواند از نوع رشته یا تابع باشد، ابتدا حالت رشته را بررسی می‌کنیم [`اسناد پایتون <https://docs.python.org/3/library/re.html#re.sub>`__]::
585+
این تابع (``sub``) حاصل انطباق‌های ممکن pattern در string را در repl جایگذاری می‌کند. این تابع همچنین دو پارامتر اختیاری دارد (flags و count)، پیش‌تر در مورد flags صحبت کردیم (که از نسخه 3.1 پایتون به این تابع اضافه شده است) و count نیز بیانگر ماکزیمم تعداد انطباقی است که می‌خواهیم در repl جایگذاری شود - این مقدار می‌بایست یک عدد مثبت باشد و مقدار صفر (مقدار پیش‌فرض) برای آن به معنی هر تعداد (نامحدود) خواهد بود. پارامتر repl در این تابع می‌تواند از نوع رشته یا تابع باشد، ابتدا حالت رشته را بررسی می‌کنیم [`اسناد پایتون <https://docs.python.org/3/library/re.html#re.sub>`__]::
593586

594587
>>> import re # Python 3.x
595588

@@ -647,6 +640,144 @@
647640
'abc@---'
648641

649642

643+
گفتیم پارامتر repl در این تابع می‌تواند از نوع تابع باشد. در این صورت ``sub`` در هر بار انطباق تابع ``repl`` را فراخوانی می‌کند و شی ``Match`` مربوط را به آن ارسال می‌کند::
644+
645+
>>> import re
646+
647+
>>> def mask_numbers(match):
648+
... string = match.group(0) # The matching string
649+
...
650+
... # string.isdigit() returns True if all characters in string are digits
651+
... if string.isdigit():
652+
... return '_' * len(string)
653+
... else:
654+
... return string
655+
...
656+
>>>
657+
658+
>>> re.sub(r'\w+', mask_numbers, 'Perl.1987.Python.1991.Ruby.1995')
659+
'Perl.____.Python.____.Ruby.____'
660+
661+
>>> re.sub(r'\w+', mask_numbers, 'My ID is 123.45679 and your ID is 98521.2')
662+
'My ID is ___._____ and your ID is _____._'
663+
664+
665+
::
666+
667+
>>> re.sub(r'\d+', lambda match : '_' * len(match.group(0)), 'Perl.1987.Python.1991.Ruby.1995')
668+
'Perl.____.Python.____.Ruby.____'
669+
670+
>>> re.sub(r'\d+', lambda match : '_' * len(match.group(0)), 'My ID is 123.45679 and your ID is 98521.2')
671+
'My ID is ___._____ and your ID is _____._'
672+
673+
*lambda در درس سیزدهم بررسی شده است.*
674+
675+
676+
677+
یادآوری می‌شود که دو نمونه کد زیر عملکردی معادل یکدیگر دارند::
678+
679+
680+
>>> pattern = re.compile('Py...n')
681+
>>> result = pattern.sub('*', 'PythonPythonPython')
682+
683+
::
684+
685+
>>> result = re.sub('Py...n', '*', 'PythonPythonPython')
686+
687+
688+
689+
690+
تابع ``subn``
691+
~~~~~~~~~~~~~~~~~~~~~~
692+
693+
694+
``subn(pattern, repl, string, count=0, flags=0)``
695+
696+
عملکرد این تابع (``subn``) همانند تابع ``sub`` است. تنها تفاوت در خروجی آن‌هاست، تابع ``subn`` یک شی تاپل محتوی نتیجه و تعداد عملیات جایگذاری را برمی‌گرداند [`اسناد پایتون <https://docs.python.org/3/library/re.html#re.subn>`__]::
697+
698+
>>> import re # Python 3.x
699+
700+
>>> string = 'Perl@1987,Python@1991,Ruby@1995'
701+
>>> repl = ' - '
702+
>>> pattern = r'@\d+,?'
703+
704+
>>> result = re.subn(pattern, repl, string)
705+
706+
>>> type(result)
707+
<class 'tuple'>
708+
709+
>>> result
710+
('Perl - Python - Ruby - ', 3)
711+
712+
>>> re.subn(pattern, repl, string, count=2)
713+
('Perl - Python - Ruby@1995', 2)
714+
715+
>>> re.subn(pattern, repl, string, count=1)
716+
('Perl - Python@1991,Ruby@1995', 1)
717+
718+
719+
720+
توابع جداسازی، ماژول ``re`` پایتون
721+
---------------------------------------
722+
723+
توابع پرکاربرد ماژول ``re`` پایتون مرتبط با عمل جداسازی بخش (هایی) از متن عبارتند از:
724+
725+
* ``split``
726+
727+
728+
تابع ``split``
729+
~~~~~~~~~~~~~~~~~~~~~~
730+
731+
732+
``split(pattern, string, maxsplit=0, flags=0)``
733+
734+
این تابع (``split``) محتوای متن string را بر اساس الگو pattern جدا (split) می‌کند و خروجی آن یک شی لیست از رشته‌ها خواهد بود. این تابع همچنین علاوه بر پارامتر flags (که از نسخه 3.1 پایتون به این تابع اضافه شده است) یک پارامتر اختیاری دیگر نیز با نام maxsplit دارد که تعیین کننده ماکزیمم تعداد جداسازی خواهد بود - این مقدار می‌بایست یک عدد مثبت باشد و مقدار صفر (مقدار پیش‌فرض) برای آن به معنی هر تعداد (نامحدود) خواهد بود. [`اسناد پایتون <https://docs.python.org/3/library/re.html#re.split>`__]::
735+
736+
>>> import re # Python 3.x
737+
738+
>>> string = 'Perl,Python,Ruby'
739+
>>> pattern = ','
740+
741+
>>> result = re.split(pattern, string)
742+
743+
>>> type(result)
744+
<class 'list'>
745+
746+
>>> result
747+
['Perl', 'Python', 'Ruby']
748+
749+
>>> re.split(pattern, string, maxsplit=1)
750+
['Perl', 'Python,Ruby']
751+
752+
>>> re.split(pattern, string, maxsplit=2)
753+
['Perl', 'Python', 'Ruby']
754+
755+
اگر الگو شامل پرانتز یا همان گروهبندی معمولی باشد، خروجی تابع ``split`` شامل جداکننده‌ها نیز می‌باشد::
756+
757+
>>> re.split('(_)', 'Perl_Python_Ruby')
758+
['Perl', '_', 'Python', '_', 'Ruby']
759+
760+
به نمونه کد پایین توجه نمایید::
761+
762+
>>> re.split('/', '/Perl/Python/Ruby/')
763+
['', 'Perl', 'Python', 'Ruby', '']
764+
765+
>>> re.split('(/)', '/Perl/Python/Ruby/')
766+
['', '/', 'Perl', '/', 'Python', '/', 'Ruby', '/', '']
767+
768+
**همانطور که مشاهده می‌شود، خروجی شامل دو رشته خالی در ابتدا و انتها می‌باشد. در مواقعی که جداکننده (delimiter) در نقاط ابتدایی و پایانی متن قرار دارد می‌بایست بروز همچین نتیجه‌ای را پیش‌بینی نمایید.**
769+
770+
771+
چنانچه در مسئله شما قرار گرفتن جداکننده در خروجی مطلوب نیست می‌توانید از طرح non-capturing پرانتزها (درس قبل) استفاده کنید::
772+
773+
>>> re.split('(?:_)', 'Perl_Python_Ruby')
774+
['Perl', 'Python', 'Ruby']
775+
776+
>>> re.split('(?:/)', '/Perl/Python/Ruby/')
777+
['', 'Perl', 'Python', 'Ruby', '']
778+
779+
780+
650781

651782

652783
|
@@ -655,7 +786,7 @@
655786

656787
:emoji-size:`😊` امیدوارم مفید بوده باشه
657788

658-
`لطفا دیدگاه و سوال‌های مرتبط با این درس خود را در کدرز مطرح نمایید. <http://www.coderz.ir/python-tutorial-re-regex/>`_
789+
`لطفا دیدگاه و سوال‌های مرتبط با این درس خود را در کدرز مطرح نمایید. <http://www.coderz.ir/python-tutorial-re-regex-2/>`_
659790

660791

661792

0 commit comments

Comments
 (0)