|
372 | 372 | [`regex101@ تست آنلاین <https://regex101.com/r/IIc4Fh/17>`__] |
373 | 373 |
|
374 | 374 |
|
| 375 | + .. tip:: |
| 376 | + این کاراکتر (``b\``) در مبحث RegEx به عنوان انطباقگر یک word(``\w``) boundary نیز خوانده میشود. word boundary (مرز واژه) به سه موقعیت گفته میشود: |
| 377 | + |
| 378 | + * قبل از نخستین کاراکتر، زمانی که کاراکتر نخست یکی از کاراکترهای شامل ``w\`` باشد |
| 379 | + * بعد از کاراکتر پایانی، زمانی که کاراکتر پایانی یکی از کاراکترهای شامل ``w\`` باشد |
| 380 | + * بین دو کاراکتر، زمانی که یکی از این دو کارامتر شامل ``w\`` باشد ولی دیگری خیر |
| 381 | + |
| 382 | + [`regex101@ تست آنلاین <https://regex101.com/r/48XLbY/1>`__] در این نمونه کد، نقاط word boundary مشخص شده است |
| 383 | + |
| 384 | + در ادمه کارکتر ``w\`` شرح داده خواهد شد. |
| 385 | + |
| 386 | + |
375 | 387 | * ``B\`` |
376 | 388 |
|
377 | 389 | برعکس ``b\``، بر حسب موقعیت قرار گرفتن، شروع یا پایان **نیافتن** یک **کلمه** را مشخص میکند. یعنی کلماتی را تطبیق میدهد که با کاراکتر یا کارکترهایی مشخصی شروع یا پایان نیافته باشند. |
|
397 | 409 |
|
398 | 410 | [`regex101@ تست آنلاین <https://regex101.com/r/IIc4Fh/19>`__] |
399 | 411 |
|
| 412 | + .. tip:: |
| 413 | + این کاراکتر (``B\``) در تضاد با ``b\`` به عنوان انطباقگر نقاطی که word(``\w``) boundary **نیستند**، نیز خوانده میشود. [`regex101@ تست آنلاین <https://regex101.com/r/M3f3VN/1>`__] |
| 414 | + |
400 | 415 |
|
401 | 416 | * ``d\`` |
402 | 417 |
|
|
521 | 536 |
|
522 | 537 |
|
523 | 538 |
|
| 539 | +انطباق با طول صفر (Zero-length Match) |
| 540 | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 541 | + |
| 542 | +یک عبارت Zero-length به عبارتی از مبحث RegEx گفته میشود که هیچ کاراکتری را انطباق نمیدهد بلکه تنها موقعیتهایی را در متن رشته مورد نظر تطبیق میدهد. برای نمونه متن رشته ``1,2`` را درنظر بگیرید، الگو ``b\`` تنها موقعیتهای قبل از ``1``، بین ``1`` و ``,``، بین ``,`` و ``2`` و بعد از ``2`` را تطبیق میدهد؛ در نتیجه الگو ``b\`` برای این متن یک Zero-length Match است. [به نتایج دقت کنید: `regex101@ تست آنلاین <https://regex101.com/r/BCuLmh/1>`__] . Zero-length Match در RegEx بسیار گمراه کننده هستند و میبایست با دقت از آنها استفاده کرد. در زیر چند نمونه الگو از Zero-length Matchها ارايه شده است:: |
| 543 | + |
| 544 | + \b |
| 545 | + \B |
| 546 | + \A |
| 547 | + \B |
| 548 | + ^ |
| 549 | + $ |
| 550 | + .* |
| 551 | + \d* |
| 552 | + |
| 553 | +سعی کنید برای الگوهای بالا در regex101.com، متنهایی را مثال بزنید، تست کنید و نتایج را با دقت مشاهده نمایید، به عنوان مثالی دیگر الگو زیر را در نظر بگیرید - این مورد را با هم بررسی میکنیم:: |
| 554 | + |
| 555 | + p* |
| 556 | + |
| 557 | +حاصل انطباق این الگو برای متنی مانند ``1,2`` هیچ فرق با الگو ``b\`` (که پیشتر صحبت شد) ندارد - تا اینجا فهمیدیم که از دید RegEx متن تنها همان کاراکترهای قابل دید نیست بلکه نقاطی مثل قبل از کاراکتر نخست، بعد از کاراکتر پایانی و حتی گاهی بین دو کاراکتر را نیز در نظر میگیرد و همچنین میدانیم که این الگو به دنبال هیچ یا هربار تکرار کاراکتر ``p`` در متن است. در نتیجه نقاطی که شامل هیچ کاراکتری نباشد یا شامل کاراکتر ``p`` باشد تطبیق پیدا میکند و از آنجایی که متن مورد نظر شامل ``p`` نمیباشد، تنها موقعیتهای Zero-length باقی میماند! - این الگو برای متن یاد شده کاملا یک Zero-length Match است. |
| 558 | + |
| 559 | +[`regex101@ تست آنلاین <https://regex101.com/r/OQrGDE/1>`__] (p در این الگو تنها یک کاراکتر متنی است - کاراکترهای دیگر را نیز خودتان تست کنید) |
| 560 | + |
| 561 | + |
| 562 | + |
| 563 | + |
| 564 | + |
524 | 565 |
|
525 | 566 | ماژول re پایتون |
526 | 567 | ----------------- |
|
685 | 726 | NO |
686 | 727 |
|
687 | 728 |
|
| 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 | + |
688 | 762 | * گروه بانام (Named Group): ``(...<P<name?)`` |
689 | 763 |
|
690 | 764 | این ساختار نمایش همان گروهبندی عادی در بحث RegEx است با این تفاوت که میتوان به هر گروه یک نام انتساب داد. به کمک ماژول re پایتون، همانطوری که در درس بعدی به صورت کامل خواهید دید، حاصل انطباق هر گروه موجود در الگو با متن مورد نظر از طریق یک اندیس عددی که به ترتیب از یک شروع میشود قابل دسترسی است، با استفاده از این ساختار میتوان حاصل انطباق را بسیار خواناتر و تنها با استفاده از نام آن دستیابی نمود:: |
|
836 | 910 | YES |
837 | 911 |
|
838 | 912 |
|
| 913 | +.. note:: |
| 914 | + |
| 915 | + قالبهای Lookahead یا Lookbehind (در کل lookaroundها) را نیز میتوان از نوع Zero-Lengthها در نظر گرفت تنها تفاوت آنها با الگوهایی که پیشتر بیان شد این است که lookaroundها ابتدا کاراکتر(هایی) را تطبیق و سپس از آن(ها) گذر میکنند. |
| 916 | + |
839 | 917 |
|
840 | 918 | | |
841 | 919 |
|
|
0 commit comments