|
112 | 112 |
|
113 | 113 | این متد از شی ``Match``، گروه (های) تطبیق داده شده بر اساس الگو مورد نظر را برمیگرداند. این متد میتواند یک یا چند آرگومان عددی دریافت کند که معرف اندیس گروه مورد نظر میباشد. در حالت فراخوانی بدون آرگومان تمامی گروههای تطبیق داده شده به صورت یک مقدار رشته برگردانده میشود و در صورتی تنها یک مقدار به آن ارسال گردد، گروه تطبیق داده شده متناظر با آن اندیس (شمارش اندیسها از یک است) در قالب یک شی رشته برگردانده میشود و در صورتی که بیش از یک اندیس به عنوان آرگومان ارسال گردد یک شی تاپل محتوی گروههای تطبیق داده شده برگردانده خواهد شد. چنانچه آرگومان ارسالی عددی منفی باشد یا اندیسی بالاتر از تعداد گروههای تطبیق داده شده باشد، یک استثنا ``IndexError`` رخ خواهد داد:: |
114 | 114 |
|
115 | | - >>> match = re.search(r"(\w+) (\w+)", "Isaac Newton, physicist") |
| 115 | + >>> match = re.search("(\w+) (\w+)", "Isaac Newton, physicist") |
116 | 116 | >>> match.group() # The entire match |
117 | 117 | 'Isaac Newton' |
118 | 118 | >>> match.group(0) # The entire match |
|
181 | 181 |
|
182 | 182 | >>> import re |
183 | 183 |
|
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") |
185 | 185 | >>> match.groupdict() |
186 | 186 | {'first_name': 'Elvis', 'last_name': 'Presley'} |
187 | 187 |
|
|
212 | 212 |
|
213 | 213 |
|
214 | 214 |
|
| 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 | + |
215 | 258 | * ``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>`__] |
216 | 259 |
|
217 | 260 | متن رشته خروجی (تطبیق یافته بر اساس الگو مورد نظر) را در نظر بگیرید، متد ``start`` اندیس شروع این متن از رشته ورودی و متد ``end`` اندیس نقطه پایان را برمیگرداند. این دو متد میتوانند یک آرگومان اختیاری نیز دریافت کنند که معرف اندیس یک گروه مشخص در الگو میباشد، با ارسال این آرگومان نتایج بر اساس تکه متن تطبیق داده شده با آن گروه برگردانده خواهد شد:: |
|
229 | 272 |
|
230 | 273 | :: |
231 | 274 |
|
232 | | - >>> match = re.search(r"(\d+)\.(\d+)", "24.1632") |
| 275 | + >>> match = re.search("(\d+)\.(\d+)", "24.1632") |
233 | 276 |
|
234 | 277 | >>> match.start() |
235 | 278 | 0 |
|
252 | 295 |
|
253 | 296 | این متد یک شی تاپل دوتایی از خروجی دو متد ``start`` و ``end`` را بر میگرداند و همانند آنها نیز یک آرگومان اختیاری دارد - نمونه خروجی: ``(m.start(group), m.end(group))``:: |
254 | 297 |
|
255 | | - >>> match = re.search(r"(\d+)\.(\d+)", "24.1632") |
| 298 | + >>> match = re.search("(\d+)\.(\d+)", "24.1632") |
256 | 299 | >>> match.span() |
257 | 300 | (0, 7) |
258 | 301 | >>> match.span(1) |
|
282 | 325 |
|
283 | 326 | :: |
284 | 327 |
|
285 | | - >>> match = re.search(r"(\d+)\.(\d+)", "24.1632") |
| 328 | + >>> match = re.search("(\d+)\.(\d+)", "24.1632") |
286 | 329 |
|
287 | 330 | >>> match.re |
288 | 331 | re.compile('(\\d+)\\.(\\d+)') |
|
0 commit comments