Skip to content

Commit 469e02e

Browse files
author
Saeid Darvish
committed
l15: completed
1 parent df61384 commit 469e02e

2 files changed

Lines changed: 76 additions & 265 deletions

File tree

lessons/l15.rst

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -758,7 +758,82 @@
758758
>>> print("YES") if pattern.match("115: Ambulance.") else print("NO")
759759
YES
760760

761-
761+
762+
* Positive Lookahead Assertion ``(...=?)``
763+
764+
این ساختار امکان ایجاد شرط مثبت، برای **پیش** از خود را در الگو فراهم می‌آورد. به این صورت که می‌توان انطباق یک متن را منوط به برقرای شرط (انطباق) بعد از آن کرد. آن بخشی از الگو که قبل از این ساختار قرار دارد، تنها زمانی انطباق داده می‌شود که این ساختار منطبق باشد. باید توجه داشت که الگو مشخص شده درون این ساختار (``...``) به عنوان حاصل انطباق برگردانده نخواهد شد و صرفا برای برقرای شرط در الگو حضور خواهد داشت::
765+
766+
>>> import re
767+
768+
>>> pattern = re.compile("(\d{3}\.0)(?=00)")
769+
770+
>>> print("YES") if pattern.match("115.099") else print("NO")
771+
NO
772+
773+
>>> print("YES") if pattern.match("115.000") else print("NO")
774+
YES
775+
776+
>>> match = pattern.search("115.000")
777+
>>> match.group()
778+
'115.0'
779+
780+
یکی از کاربردهای این ساختار، اعتبارسنجی گذرواژه است. به نمونه کد زیر توجه کنید::
781+
782+
783+
>>> pattern = re.compile("(?=\A\w{6,8}\Z)")
784+
785+
>>> print("YES") if pattern.match("12345678") else print("NO")
786+
YES
787+
>>> print("YES") if pattern.match("123456") else print("NO")
788+
YES
789+
>>> print("YES") if pattern.match("123") else print("NO")
790+
NO
791+
792+
در این نمونه کد، از بخش قبل از ساختار صرف نظر شده است و بنابراین حاصل انطباقی نیز در کار نخواهد بود، همچنین با استفاده از دو ‍‍ ``A\`` و ``Z\`` لزوم ابتدا و انتها الگو نیز مشخص شده است. حال به الگو بالا شرط دیگری اضافه می‌کنیم که گذرواژه حداقل شامل یک حرف الفبایی نیز باشد::
793+
794+
795+
>>> pattern = re.compile("(?=\A\w{6,8}\Z)(?=.*[a-zA-Z]+)")
796+
797+
>>> print("YES") if pattern.match("d2345678") else print("NO")
798+
YES
799+
>>> print("YES") if pattern.match("2345ABcd") else print("NO")
800+
YES
801+
>>> print("YES") if pattern.match("12345678") else print("NO")
802+
NO
803+
804+
805+
* Negative Lookahead Assertion ``(...!?)``
806+
807+
معکوس حالت قبل است. به این معنی که انطباق یک متن منوط به عدم برقرای شرط (انطباق) **بعد** از آن است. آن بخشی از الگو که قبل از این ساختار قرار دارد، تنها زمانی انطباق داده می‌شود که این ساختار منطبق **نباشد**.
808+
809+
810+
* Positive Lookbehind Assertion ``(...=>?)``
811+
812+
این ساختار امکان ایجاد شرط مثبت، برای **بعد** از خود را در الگو فراهم می‌آورد. به این صورت که می‌توان انطباق یک متن را منوط به برقرای شرط (انطباق) پیش از آن کرد. آن بخشی از الگو که بعد از این ساختار قرار دارد، تنها زمانی انطباق داده می‌شود که این ساختار منطبق باشد. باید توجه داشت که الگو مشخص شده درون این ساختار (``...``) به عنوان حاصل انطباق برگردانده نخواهد شد و صرفا برای برقرای شرط در الگو حضور خواهد داشت::
813+
814+
>>> import re
815+
>>> match = re.search('(?<=abc)def', 'abcdef')
816+
>>> match.group()
817+
>>> 'def'
818+
819+
820+
* Negative Lookbehind Assertion ``(...!>?)``
821+
822+
معکوس حالت قبل است. به این معنی که انطباق یک متن منوط به عدم برقرای شرط (انطباق) **قبل** از آن است. آن بخشی از الگو که بعد از این ساختار قرار دارد، تنها زمانی انطباق داده می‌شود که این ساختار منطبق **نباشد**.
823+
824+
825+
* Yes/No Pattern ``(?(id/name)yes-pattern|no-pattern)``
826+
827+
این ساختار نیز نوعی شرط گذاری است. به این صورت که می‌توان تعیین کرد بر اساس وضعیت انطباق گروه‌بندی‌های موجود (با ذکر نام گروه یا شماره اندیس آن) در الگو، یکی از الگوهای بله (yes-pattern) یا خیر (no-pattern) این ساختار بررسی شود::
828+
829+
>>> pattern = re.compile('^(###)?foo(?(1)bar|baz)')
830+
831+
>>> print("YES") if pattern.match("###foobar") else print("NO")
832+
YES
833+
>>> print("YES") if pattern.match("###foobaz") else print("NO")
834+
NO
835+
>>> print("YES") if pattern.match("foobaz") else print("NO")
836+
YES
762837

763838

764839

lessons/l16.rst

Lines changed: 0 additions & 264 deletions
This file was deleted.

0 commit comments

Comments
 (0)