|
1 | 1 | .. role:: emoji-size |
2 | 2 |
|
3 | 3 | .. meta:: |
4 | | - :description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، آموزش ماژول re در پایتون، عبارات باقاعده در پایتون، Regular expression در پایتون، regex در پایتون |
| 4 | + :description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، آموزش ماژول re در پایتون، عبارات باقاعده در پایتون، Regular expression در پایتون، regex در پایتون، توابع ماژول re پایتون - |
5 | 5 | :keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, تابع, کتابخانه, پایتون, re |
6 | 6 |
|
7 | 7 |
|
|
129 | 129 | File "<stdin>", line 1, in <module> |
130 | 130 | IndexError: no such group |
131 | 131 |
|
132 | | - در صورتی که الگو مورد نظر شامل هیچ گروهبندی نباشد، فراخوانی بدون آرگومان (یا ارسال آرگومان صفر) این متد، تمام متن تطبیق داده شده را برمیگرداند:: |
| 132 | + فراخوانی بدون آرگومان (یا ارسال آرگومان صفر - مقدار پیشفرض) این متد، تمام متن تطبیق داده شده را برمیگرداند:: |
133 | 133 | |
134 | 134 | |
135 | 135 | >>> pattern = re.compile('Py...n') |
|
139 | 139 | |
140 | 140 | >>> match.group(0) |
141 | 141 | '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 | | - |
149 | 142 |
|
150 | 143 |
|
151 | 144 |
|
|
214 | 207 |
|
215 | 208 | * ``Match.expand(template)`` [`اسناد پایتون <https://docs.python.org/3/library/re.html#re.Match.expand>`__] |
216 | 209 |
|
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) جایگذاری میشوند:: |
218 | 211 |
|
219 | 212 | >>> import re |
220 | 213 |
|
|
376 | 369 |
|
377 | 370 | تفاوت دو تابع ``match`` و ``search`` [`اسناد پایتون <https://docs.python.org/3/library/re.html#search-vs-match>`__]: |
378 | 371 |
|
379 | | - هنگام استفاده از تابع ``match``، از همان ابتدای متن مورد نظر میبایست با الگو تطابق صورت پذیرد (حتی در متنهای چند سطری) ولی تابع ``search`` انجام انطباق را در هر جایی از متن دنبال میکند. |
| 372 | + هنگام استفاده از تابع ``match``، از همان ابتدای متن مورد نظر، میبایست تطابق با الگو صورت پذیرد (حتی در متنهای چند سطری) ولی تابع ``search`` انجام انطباق را در هر جایی از متن دنبال میکند. |
380 | 373 |
|
381 | | - هنگام استفاده از نشانه ``re.MULTILINE`` در تابع ``search``، کاراکتر ``^`` در الگو از معنای **ابتدای متن** به معنای **ابتدای هر سطر** تغییر میکند ولی از نظر تابع ``match`` وجود کاراکتر ``^`` در الگو همواره به معنی ابتدای متن میباشد (نه هر سطر):: |
| 374 | + هنگام استفاده از نشانه ``re.MULTILINE`` در تابع ``search``، کاراکتر ``^`` در الگو از معنای **ابتدای متن** به معنای **ابتدای هر سطر** تغییر میکند (درس قبل) ولی از نظر تابع ``match`` وجود کاراکتر ``^`` در الگو همواره به معنی ابتدای متن میباشد (نه هر سطر):: |
382 | 375 |
|
383 | 376 | >>> import re |
384 | 377 | >>> string = 'Perl\nPython\nRuby' # 3 lines |
|
589 | 582 |
|
590 | 583 | ``sub(pattern, repl, string, count=0, flags=0)`` |
591 | 584 |
|
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>`__]:: |
593 | 586 |
|
594 | 587 | >>> import re # Python 3.x |
595 | 588 |
|
|
647 | 640 | 'abc@---' |
648 | 641 |
|
649 | 642 |
|
| 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 | + |
650 | 781 |
|
651 | 782 |
|
652 | 783 | | |
|
655 | 786 |
|
656 | 787 | :emoji-size:`😊` امیدوارم مفید بوده باشه |
657 | 788 |
|
658 | | -`لطفا دیدگاه و سوالهای مرتبط با این درس خود را در کدرز مطرح نمایید. <http://www.coderz.ir/python-tutorial-re-regex/>`_ |
| 789 | +`لطفا دیدگاه و سوالهای مرتبط با این درس خود را در کدرز مطرح نمایید. <http://www.coderz.ir/python-tutorial-re-regex-2/>`_ |
659 | 790 |
|
660 | 791 |
|
661 | 792 |
|
0 commit comments