Skip to content

Commit 7b5cb6d

Browse files
author
Saeid Darvish
committed
l16: compelete match object section
1 parent ecadc2b commit 7b5cb6d

1 file changed

Lines changed: 48 additions & 5 deletions

File tree

lessons/l16.rst

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@
112112

113113
این متد از شی ``Match``، گروه (های) تطبیق داده شده بر اساس الگو مورد نظر را برمی‌گرداند. این متد می‌تواند یک یا چند آرگومان عددی دریافت کند که معرف اندیس گروه مورد نظر می‌باشد. در حالت فراخوانی بدون آرگومان تمامی گروه‌های تطبیق داده شده به صورت یک مقدار رشته برگردانده می‌شود و در صورتی تنها یک مقدار به آن ارسال گردد، گروه تطبیق داده شده متناظر با آن اندیس (شمارش اندیس‌ها از یک است) در قالب یک شی رشته برگردانده می‌شود و در صورتی که بیش از یک اندیس به عنوان آرگومان ارسال گردد یک شی تاپل محتوی گروه‌های تطبیق داده شده برگردانده خواهد شد. چنانچه آرگومان ارسالی عددی منفی باشد یا اندیسی بالاتر از تعداد گروه‌های تطبیق داده شده باشد، یک استثنا ``IndexError`` رخ خواهد داد::
114114

115-
>>> match = re.search(r"(\w+) (\w+)", "Isaac Newton, physicist")
115+
>>> match = re.search("(\w+) (\w+)", "Isaac Newton, physicist")
116116
>>> match.group() # The entire match
117117
'Isaac Newton'
118118
>>> match.group(0) # The entire match
@@ -181,7 +181,7 @@
181181

182182
>>> import re
183183

184-
>>> match = re.search(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Elvis Presley")
184+
>>> match = re.search("(?P<first_name>\w+) (?P<last_name>\w+)", "Elvis Presley")
185185
>>> match.groupdict()
186186
{'first_name': 'Elvis', 'last_name': 'Presley'}
187187

@@ -212,6 +212,49 @@
212212

213213

214214

215+
* ``Match.expand(template)`` [`اسناد پایتون <https://docs.python.org/3/library/re.html#re.Match.expand>`__]
216+
217+
این متد حاصل انطباق را در قالب ``template`` جایگذاری کرده و یک شی رشته جدید برمی‌گرداند. قالب در اینجا یک رشته است که در آن می‌توان به حاصل انطباق گروهبندی‌های موجود در الگو ارجاع داد به این صورت کرد که می‌توان گروه‌های بی‌نام موجود در الگو را با استفاده از ارجاع عددی به شماره اندیس آن‌ها به مانند ``1\``، ``2\`` و گروه‌های بانام را با استفاده از نام گروه به مانند ``<g<name\`` یا ``<g<1\`` در قالب موجود جایگذاری کرد. Escape character‌های موجود در قالب به کاراکترهای مناسب خود در متن خروجی تبدیل می‌شوند و از **نسخه 3.5 پایتون** گروه‌هایی که هیچ انطباقی نداشته‌اند با هیچی (empty string) جایگذاری می‌شوند::
218+
219+
>>> import re
220+
221+
>>> match = re.search('(\w+),(\w+),(\w+)', 'Jazz,Rock,Pop')
222+
>>> match.groups()
223+
('Jazz', 'Rock', 'Pop')
224+
225+
>>> match.expand('-->\1---->\2------>\3') # Wrong result!!!
226+
'-->\x01---->\x02------>\x03'
227+
228+
>>> match.expand('-->\\1---->\\2------>\\3')
229+
'-->Jazz---->Rock------>Pop'
230+
231+
>>> match.expand(r'-->\1---->\2------>\3')
232+
'-->Jazz---->Rock------>Pop'
233+
234+
235+
.. note::
236+
در نمونه کد بالا، خروجی نخستین استفاده از متد ``expand`` متناسب با انتظار نیست، دلیل هم مربوط به وجود کاراکترهایی با ``\`` است (escape characters) که باعث بروز اخلال در تحلیل رشته قالب شده است. بهتر است همیشه در این مواقع از قوانین **raw string** پیروی نماییم: استفاده از ``\\`` به جای ``\`` (همانند ``n\\``) یا قرار دادن یک کاراکتر ``r`` یا ``R`` در ابتدای رشته (همانند ``'r'\n``). در این صورت کاراکترهایی همچون newline یا ``n\`` در رشته، معنای خود را از دست می‌دهند. (یادآوری از درس هفتم)
237+
238+
239+
.. tip::
240+
بلای Backslash [`اسناد پایتون <https://docs.python.org/3/howto/regex.html#the-backslash-plague>`__]
241+
242+
همیشه در هنگام کار با RegEx (نه فقط در زبان پایتون!) مواظب escape characters یا backslash characters باشید.
243+
244+
::
245+
246+
>>> match = re.search('(?P<num>\d+)', 'Top 100 songs')
247+
>>> match.group(1)
248+
'100'
249+
250+
>>> match.expand('--- \g<num> ---')
251+
'--- 100 ---'
252+
>>> match.expand('--- \g<1> ---')
253+
'--- 100 ---'
254+
255+
256+
257+
215258
* ``Match.start([group])`` [`اسناد پایتون <https://docs.python.org/3/library/re.html#re.Match.start>`__] ``Match.end([group])`` [`اسناد پایتون <https://docs.python.org/3/library/re.html#re.Match.end>`__]
216259

217260
متن رشته خروجی (تطبیق یافته بر اساس الگو مورد نظر) را در نظر بگیرید، متد ``start`` اندیس شروع این متن از رشته ورودی و متد ``end`` اندیس نقطه پایان را برمی‌گرداند. این دو متد می‌توانند یک آرگومان اختیاری نیز دریافت کنند که معرف اندیس یک گروه مشخص در الگو می‌باشد، با ارسال این آرگومان نتایج بر اساس تکه متن تطبیق داده شده با آن گروه برگردانده خواهد شد::
@@ -229,7 +272,7 @@
229272

230273
::
231274

232-
>>> match = re.search(r"(\d+)\.(\d+)", "24.1632")
275+
>>> match = re.search("(\d+)\.(\d+)", "24.1632")
233276

234277
>>> match.start()
235278
0
@@ -252,7 +295,7 @@
252295

253296
این متد یک شی تاپل دوتایی از خروجی دو متد ``start`` و ``end`` را بر می‌گرداند و همانند آنها نیز یک آرگومان اختیاری دارد - نمونه خروجی: ``(m.start(group), m.end(group))``::
254297

255-
>>> match = re.search(r"(\d+)\.(\d+)", "24.1632")
298+
>>> match = re.search("(\d+)\.(\d+)", "24.1632")
256299
>>> match.span()
257300
(0, 7)
258301
>>> match.span(1)
@@ -282,7 +325,7 @@
282325

283326
::
284327

285-
>>> match = re.search(r"(\d+)\.(\d+)", "24.1632")
328+
>>> match = re.search("(\d+)\.(\d+)", "24.1632")
286329

287330
>>> match.re
288331
re.compile('(\\d+)\\.(\\d+)')

0 commit comments

Comments
 (0)