برای انجام پردازش عبارات منظم در پایتون، از ماژول re از کتابخانه استاندارد استفاده می کنیم. این امکان را به شما می دهد تا با استفاده از الگوهای بیان منظم رشته ها را استخراج، جایگزین و تقسیم کنید.
- re — Regular expression operations — Python 3.10.0 Documentation
- Regular Expression HOWTO — Python 3.10.0 Documentation
در این قسمت ابتدا به توضیح توابع و روش های ماژول re می پردازیم.
- کامپایل الگوهای بیان منظم:
compile()
- شیء مطابقت
- بررسی کنید که آیا ابتدای رشته مطابقت دارد، استخراج کنید:
match()
- بررسی کنید که مسابقات به ابتدا محدود نمی شود:
search()
- بررسی کنید که آیا کل رشته مطابقت دارد:
fullmatch()
- لیستی از تمام قسمت های منطبق را دریافت کنید:
findall()
- تمام قسمت های منطبق را به عنوان یک تکرار کننده دریافت کنید:
finditer()
- قسمت منطبق را جایگزین کنید:
sub()
،subn()
- تقسیم رشته ها با الگوهای بیان منظم:
split()
پس از آن، متا کاراکترها (کاراکترهای خاص) و دنباله های خاص عبارات منظم قابل استفاده در ماژول re را توضیح خواهم داد. اساساً، این دستور عبارت استاندارد استاندارد است، اما در مورد تنظیم پرچم ها (مخصوصا re.ASCII) مراقب باشید.
- متاکاراکترهای بیان منظم، توالی های خاص و هشدارها در پایتون
- تنظیم پرچم
- محدود به کاراکترهای ASCII:
re.ASCII
- به حروف بزرگ و کوچک حساس نیست:
re.IGNORECASE
- ابتدا و انتهای هر خط را مطابقت دهید:
re.MULTILINE
- چند پرچم را مشخص کنید
- محدود به کاراکترهای ASCII:
- حریص و غیر حریص مسابقات
- کامپایل الگوی عبارت منظم: compile()
- شیء مطابقت
- بررسی کنید که آیا ابتدای یک رشته مطابقت دارد، استخراج کنید: match()
- بررسی کنید که منطبقها به ابتدا محدود نمیشوند، استخراج کنید: search()
- بررسی کنید که آیا کل رشته مطابقت دارد: fullmatch()
- لیستی از تمام قسمت های منطبق را دریافت کنید: findall()
- تمام قسمت های منطبق را به عنوان یک تکرار کننده دریافت کنید: finditer()
- قطعات منطبق را جایگزین کنید: sub()، subn()
- تقسیم رشته ها با الگوهای عبارت منظم: split()
- متاکاراکترهای بیان منظم، توالی های خاص و هشدارها در پایتون
- تنظیم پرچم
- حریص و غیر حریص مسابقات
کامپایل الگوی عبارت منظم: compile()
دو روش برای انجام پردازش عبارات منظم در ماژول re وجود دارد.
اجرا با تابع
اولی یک تابع است.re.match()
،re.sub()
توابعی مانند این برای انجام استخراج، جایگزینی و سایر فرآیندها با استفاده از الگوهای بیان منظم در دسترس هستند.
جزئیات توابع بعدا توضیح داده خواهد شد، اما در همه آنها، اولین آرگومان رشته الگوی عبارت منظم و به دنبال آن رشته مورد پردازش و غیره است. به عنوان مثال، در re.sub() که جایگزینی را انجام می دهد، آرگومان دوم رشته جایگزینی است و آرگومان سوم رشته ای است که باید پردازش شود.
import re
s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'
m = re.match(r'([a-z]+)@([a-z]+)\.com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
result = re.sub(r'([a-z]+)@([a-z]+)\.com', 'new-address', s)
print(result)
# new-address, new-address, ccc@zzz.net
توجه داشته باشید که [a-z] در الگوی عبارت منظم در این مثال به معنای هر کاراکتری از a تا z (یعنی حروف کوچک) است و + به معنای تکرار الگوی قبلی (در این مورد [a-z]) یک یا چند بار است. [a-z]+ با هر رشته ای که یک یا چند کاراکتر حروف کوچک را تکرار می کند مطابقت دارد.
. یک شخصیت متا (شخصیتی با معنای خاص) است و باید با یک بک اسلش از آن فرار کرد.
از آنجایی که رشتههای الگوی عبارت منظم اغلب از بک اسلشهای زیادی استفاده میکنند، استفاده از رشتههای خام مانند مثال راحت است.
در روشی از یک شی الگوی عبارت منظم اجرا می شود
روش دوم برای پردازش عبارات منظم در ماژول re، روش شی الگوی بیان منظم است.
با استفاده از re.compile()، می توانید یک رشته الگوی عبارت منظم را برای ایجاد یک شی الگوی عبارت منظم کامپایل کنید.
p = re.compile(r'([a-z]+)@([a-z]+)\.com')
print(p)
# re.compile('([a-z]+)@([a-z]+)\\.com')
print(type(p))
# <class 're.Pattern'>
re.match()
،re.sub()
به عنوان مثال، فرآیند مشابه این توابع را می توان با مطابقت متدهای(),sub() اشیاء عبارت منظم اجرا کرد.
m = p.match(s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
result = p.sub('new-address', s)
print(result)
# new-address, new-address, ccc@zzz.net
تمام توابع ()re.xxx که در زیر توضیح داده شده اند نیز به عنوان متدهای شیء عبارت منظم ارائه می شوند.
اگر فرآیندی را تکرار میکنید که از همان الگوی استفاده میکند، کارآمدتر است که یک شیء عبارت منظم با re.compile() تولید کنید و از آن در اطراف استفاده کنید.
در کد نمونه زیر، تابع بدون کامپایل برای راحتی استفاده می شود، اما اگر می خواهید از همان الگوی مکرر استفاده کنید، توصیه می شود آن را از قبل کامپایل کرده و به عنوان یک متد از یک شی عبارت منظم اجرا کنید.
شیء مطابقت
match()، search() و غیره یک شی مطابق را برمی گرداند.
s = 'aaa@xxx.com'
m = re.match(r'[a-z]+@[a-z]+\.[a-z]+', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
print(type(m))
# <class 're.Match'>
رشته و موقعیت منطبق با استفاده از روش های زیر از شی مطابقت به دست می آیند.
- دریافت مکان مسابقه:
start()
،end()
،span()
- رشته مطابق را دریافت کنید:
group()
- رشته هر گروه را دریافت کنید:
groups()
print(m.start())
# 0
print(m.end())
# 11
print(m.span())
# (0, 11)
print(m.group())
# aaa@xxx.com
اگر بخشی از یک الگوی عبارت منظم را در یک رشته با پرانتز () قرار دهید، آن قسمت به عنوان یک گروه پردازش می شود. در این حالت، رشته قسمتی که با هر گروه در group() مطابقت دارد را می توان به صورت تاپل به دست آورد.
m = re.match(r'([a-z]+)@([a-z]+)\.([a-z]+)', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
print(m.groups())
# ('aaa', 'xxx', 'com')
بررسی کنید که آیا ابتدای یک رشته مطابقت دارد، استخراج کنید: match()
match() در صورتی که ابتدای رشته با الگو مطابقت داشته باشد یک شی مطابق را برمی گرداند.
همانطور که در بالا ذکر شد، شیء match را می توان برای استخراج زیررشته منطبق یا به سادگی بررسی اینکه آیا مطابقت ایجاد شده است استفاده می شود.
match() فقط ابتدا را بررسی می کند. اگر در ابتدا رشته منطبقی وجود نداشته باشد، None را برمی گرداند.
s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'
m = re.match(r'[a-z]+@[a-z]+\.com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
m = re.match(r'[a-z]+@[a-z]+\.net', s)
print(m)
# None
بررسی کنید که منطبقها به ابتدا محدود نمیشوند، استخراج کنید: search()
مانند match()، اگر یک شیء مطابقت داشته باشد، آن را برمی گرداند.
اگر چندین قسمت منطبق وجود داشته باشد، فقط اولین قسمت منطبق برگردانده می شود.
s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'
m = re.search(r'[a-z]+@[a-z]+\.net', s)
print(m)
# <re.Match object; span=(26, 37), match='ccc@zzz.net'>
m = re.search(r'[a-z]+@[a-z]+\.com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
اگر می خواهید تمام قسمت های منطبق را بدست آورید، از findall() یا finditer() همانطور که در زیر توضیح داده شده است استفاده کنید.
بررسی کنید که آیا کل رشته مطابقت دارد: fullmatch()
برای بررسی اینکه آیا کل رشته با الگوی عبارت منظم مطابقت دارد یا خیر، از fullmatch() استفاده کنید. برای مثال برای بررسی اینکه آیا یک رشته به عنوان آدرس ایمیل معتبر است یا خیر، این کار مفید است.
اگر کل رشته مطابقت داشته باشد، یک شیء مطابقت برگردانده می شود.
s = 'aaa@xxx.com'
m = re.fullmatch(r'[a-z]+@[a-z]+\.com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
در صورت وجود قطعات بی همتا (فقط منطبق جزئی یا عدم تطابق)، هیچ یک برگردانده می شود.
s = '!!!aaa@xxx.com!!!'
m = re.fullmatch(r'[a-z]+@[a-z]+\.com', s)
print(m)
# None
fullmatch() در پایتون 3.4 اضافه شد. اگر می خواهید همین کار را در نسخه های قبلی انجام دهید، از match() و یک متا کاراکتر مطابق $ در پایان استفاده کنید. اگر کل رشته از ابتدا تا انتها مطابقت نداشته باشد، None را برمیگرداند.
s = '!!!aaa@xxx.com!!!'
m = re.match(r'[a-z]+@[a-z]+\.com$', s)
print(m)
# None
لیستی از تمام قسمت های منطبق را دریافت کنید: findall()
()finall لیستی از تمام زیررشتههای منطبق را برمیگرداند. توجه داشته باشید که عناصر لیست، اشیاء منطبق نیستند بلکه رشتهها هستند.
s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'
result = re.findall(r'[a-z]+@[a-z]+\.[a-z]+', s)
print(result)
# ['aaa@xxx.com', 'bbb@yyy.com', 'ccc@zzz.net']
تعداد قطعات منطبق را می توان با استفاده از تابع داخلی len() بررسی کرد که تعداد عناصر موجود در لیست را برمی گرداند.
print(len(result))
# 3
گروه بندی با پرانتز() در یک الگوی عبارت منظم، لیستی از تاپل ها را برمی گرداند که عناصر آن رشته های هر گروه هستند. این معادل گروه () در شیء match است.
result = re.findall(r'([a-z]+)@([a-z]+)\.([a-z]+)', s)
print(result)
# [('aaa', 'xxx', 'com'), ('bbb', 'yyy', 'com'), ('ccc', 'zzz', 'net')]
پرانتزهای گروه () را می توان تودرتو کرد، بنابراین اگر می خواهید کل مطابقت را نیز دریافت کنید، فقط کل مسابقه را در پرانتز () قرار دهید.
result = re.findall(r'(([a-z]+)@([a-z]+)\.([a-z]+))', s)
print(result)
# [('aaa@xxx.com', 'aaa', 'xxx', 'com'), ('bbb@yyy.com', 'bbb', 'yyy', 'com'), ('ccc@zzz.net', 'ccc', 'zzz', 'net')]
اگر مطابقت پیدا نشد، یک تاپل خالی برگردانده می شود.
result = re.findall('[0-9]+', s)
print(result)
# []
تمام قسمت های منطبق را به عنوان یک تکرار کننده دریافت کنید: finditer()
finditer() تمام قسمت های منطبق را به عنوان یک تکرار کننده برمی گرداند. المانها رشتههایی مانند findall() نیستند، بلکه با اشیاء مطابقت دارند، بنابراین میتوانید موقعیت (شاخص) قطعات منطبق را بدست آورید.
خود تکرار کننده را نمی توان با print() چاپ کرد تا محتویات آن را دریافت کند. اگر از تابع داخلی () next یا دستور for استفاده کنید، می توانید محتویات را یکی یکی دریافت کنید.
s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'
result = re.finditer(r'[a-z]+@[a-z]+\.[a-z]+', s)
print(result)
# <callable_iterator object at 0x10b0efa90>
print(type(result))
# <class 'callable_iterator'>
for m in result:
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
# <re.Match object; span=(13, 24), match='bbb@yyy.com'>
# <re.Match object; span=(26, 37), match='ccc@zzz.net'>
همچنین می توان آن را به یک لیست با list() تبدیل کرد.
l = list(re.finditer(r'[a-z]+@[a-z]+\.[a-z]+', s))
print(l)
# [<re.Match object; span=(0, 11), match='aaa@xxx.com'>, <re.Match object; span=(13, 24), match='bbb@yyy.com'>, <re.Match object; span=(26, 37), match='ccc@zzz.net'>]
print(l[0])
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
print(type(l[0]))
# <class 're.Match'>
print(l[0].span())
# (0, 11)
اگر می خواهید موقعیت همه قسمت های منطبق را بدست آورید، نماد درک لیست راحت تر از list() است.
print([m.span() for m in re.finditer(r'[a-z]+@[a-z]+\.[a-z]+', s)])
# [(0, 11), (13, 24), (26, 37)]
تکرار کننده عناصر را به ترتیب بیرون می آورد. توجه داشته باشید که اگر سعی کنید عناصر بیشتری را پس از رسیدن به انتها استخراج کنید، چیزی برایتان باقی نمی ماند.
result = re.finditer(r'[a-z]+@[a-z]+\.[a-z]+', s)
for m in result:
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
# <re.Match object; span=(13, 24), match='bbb@yyy.com'>
# <re.Match object; span=(26, 37), match='ccc@zzz.net'>
print(list(result))
# []
قطعات منطبق را جایگزین کنید: sub()، subn()
با استفاده از sub()، می توانید قسمت مطابقت شده را با رشته دیگری جایگزین کنید. رشته جایگزین شده برگردانده خواهد شد.
s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'
result = re.sub(r'[a-z]+@[a-z]+\.com', 'new-address', s)
print(result)
# new-address, new-address, ccc@zzz.net
print(type(result))
# <class 'str'>
هنگام گروه بندی با پرانتز()، رشته مطابقت شده را می توان در رشته جایگزین شده استفاده کرد.
بهطور پیشفرض، موارد زیر پشتیبانی میشوند: توجه داشته باشید که برای رشتههای معمولی که رشتههای خام نیستند، برای فرار از بک اسلش باید قبل از بک اسلش فهرست شود.
\1 | پرانتز اول |
\2 | پرانتز دوم |
\3 | پرانتز سوم |
result = re.sub(r'([a-z]+)@([a-z]+)\.com', r'\1@\2.net', s)
print(result)
# aaa@xxx.net, bbb@yyy.net, ccc@zzz.net
?P<xxx>
اگر گروه را با نوشتن این عبارت در ابتدای پرانتز الگوی عبارت منظم نام گذاری کنید، می توانید آن را با استفاده از نام به جای عدد، مانند شکل زیر مشخص کنید.\g<xxx>
result = re.sub(r'(?P<local>[a-z]+)@(?P<SLD>[a-z]+)\.com', r'\g<local>@\g<SLD>.net', s)
print(result)
# aaa@xxx.net, bbb@yyy.net, ccc@zzz.net
شمارش آرگومان حداکثر تعداد جایگزین ها را مشخص می کند. فقط شمارش از سمت چپ جایگزین خواهد شد.
result = re.sub(r'[a-z]+@[a-z]+\.com', 'new-address', s, count=1)
print(result)
# new-address, bbb@yyy.com, ccc@zzz.net
subn() یک تاپلی از رشته جایگزین شده (همان مقدار برگشتی sub()) و تعداد قطعات جایگزین شده (تعدادی که با الگو مطابقت دارد) را برمی گرداند.
result = re.subn(r'[a-z]+@[a-z]+\.com', 'new-address', s)
print(result)
# ('new-address, new-address, ccc@zzz.net', 2)
روش تعیین آرگومان ها همانند ()sub است. می توانید از قسمت گروه بندی شده توسط پرانتز استفاده کنید یا تعداد آرگومان را مشخص کنید.
result = re.subn(r'(?P<local>[a-z]+)@(?P<SLD>[a-z]+)\.com', r'\g<local>@\g<SLD>.net', s)
print(result)
# ('aaa@xxx.net, bbb@yyy.net, ccc@zzz.net', 2)
result = re.subn(r'[a-z]+@[a-z]+\.com', 'new-address', s, count=1)
print(result)
# ('new-address, bbb@yyy.com, ccc@zzz.net', 1)
تقسیم رشته ها با الگوهای عبارت منظم: split()
split() رشته را در قسمتی که با الگو مطابقت دارد تقسیم می کند و آن را به صورت لیست برمی گرداند.
توجه داشته باشید که اولین و آخرین تطابق شامل رشته های خالی در ابتدا و انتهای لیست حاصل خواهد بود.
s = '111aaa222bbb333'
result = re.split('[a-z]+', s)
print(result)
# ['111', '222', '333']
result = re.split('[0-9]+', s)
print(result)
# ['', 'aaa', 'bbb', '']
آرگومان maxsplit حداکثر تعداد تقسیمات (قطعه) را مشخص می کند. فقط شمارش از سمت چپ تقسیم می شود.
result = re.split('[a-z]+', s, 1)
print(result)
# ['111', '222bbb333']
متاکاراکترهای بیان منظم، توالی های خاص و هشدارها در پایتون
متا کاراکترهای اصلی عبارت منظم (کاراکترهای خاص) و دنباله های ویژه ای که می توان در ماژول Python 3 re استفاده کرد به شرح زیر است.
فرا شخصیت | فهرست |
---|---|
. | هر کاراکتری غیر از خط جدید (از جمله خط جدید با پرچم DOTALL) |
^ | ابتدای رشته (همچنین ابتدای هر خط با پرچم MULTILINE مطابقت دارد) |
$ | انتهای رشته (همچنین انتهای هر خط با پرچم MULTILINE مطابقت دارد) |
* | الگوی قبلی را بیش از 0 بار تکرار کنید |
+ | الگوی قبلی را حداقل یک بار تکرار کنید. |
? | الگوی قبلی را 0 یا 1 بار تکرار کنید |
{m} | الگوی قبلی را m بار تکرار کنید |
{m, n} | آخرین الگو.m ~n تکرار |
[] | مجموعه ای از شخصیت ها[] با هر یک از این شخصیت ها مطابقت دارد |
| | یاA|B با الگوی A یا B مطابقت دارد |
سکانس ویژه | فهرست |
---|---|
\d | اعداد اعشاری یونیکد (محدود به اعداد اسکی با پرچم اسکی) |
\D | \d یعنی برعکس این. |
\s | نویسههای فضای خالی یونیکد (محدود به نویسههای فضای سفید ASCII با پرچم ASCII) |
\S | \s یعنی برعکس این. |
\w | نویسهها و زیرخطهای کلمه یونیکد (محدود به نویسههای الفبایی عددی ASCII و زیرخط با پرچم ASCII) |
\W | \w یعنی برعکس این. |
همه آنها در این جدول فهرست نشده اند. برای فهرست کامل به اسناد رسمی مراجعه کنید.
همچنین توجه داشته باشید که برخی از معانی در پایتون 2 متفاوت است.
تنظیم پرچم
همانطور که در جدول بالا نشان داده شده است، برخی از متا کاراکترها و دنباله های خاص بسته به پرچم حالت خود را تغییر می دهند.
فقط پرچم های اصلی در اینجا پوشانده شده است. برای بقیه به اسناد رسمی مراجعه کنید.
محدود به کاراکترهای ASCII: re.ASCII
\w
این همچنین با کانجی دو بایتی، کاراکترهای الفبایی و غیره به طور پیشفرض برای رشتههای پایتون 3 مطابقت دارد. معادل عبارت زیر نیست زیرا یک عبارت منظم استاندارد نیست.[a-zA-Z0-9_]
m = re.match(r'\w+', '漢字ABC123')
print(m)
# <re.Match object; span=(0, 11), match='漢字ABC123'>
m = re.match('[a-zA-Z0-9_]+', '漢字ABC123')
print(m)
# None
اگر re.ASCII را برای پرچمهای آرگومان در هر تابع مشخص کنید، یا پرچم درون خطی زیر را به ابتدای رشته الگوی عبارت منظم اضافه کنید، فقط با کاراکترهای ASCII مطابقت خواهد داشت (با کاراکترهای ژاپنی دو بایتی، حروف عددی و غیره مطابقت ندارد. .).(?a)
در این صورت دو مورد زیر معادل هستند.\w
#ERROR![a-zA-Z0-9_]
m = re.match(r'\w+', '漢字ABC123', flags=re.ASCII)
print(m)
# None
m = re.match(r'(?a)\w+', '漢字ABC123')
print(m)
# None
همین امر هنگام کامپایل با re.compile(). از پرچمهای آرگومان یا پرچمهای درون خطی استفاده کنید.
p = re.compile(r'\w+', flags=re.ASCII)
print(p)
# re.compile('\\w+', re.ASCII)
print(p.match('漢字ABC123'))
# None
p = re.compile(r'(?a)\w+')
print(p)
# re.compile('(?a)\\w+', re.ASCII)
print(p.match('漢字ABC123'))
# None
ASCII به عنوان فرم کوتاه re نیز موجود است. A. شما می توانید از هر دو استفاده کنید.
print(re.ASCII is re.A)
# True
\W که برعکس \W است نیز تحت تأثیر re.ASCII و پرچمهای درون خطی قرار میگیرد.
m = re.match(r'\W+', '漢字ABC123')
print(m)
# None
m = re.match(r'\W+', '漢字ABC123', flags=re.ASCII)
print(m)
# <re.Match object; span=(0, 11), match='漢字ABC123'>
همانند \w، دو کاراکتر زیر به طور پیشفرض با نویسههای تکبایتی و دو بایتی مطابقت دارند، اما اگر پرچمهای re.ASCII یا درون خطی مشخص شده باشند، به نویسههای تکبایتی محدود میشوند.
- اعداد را مطابقت دهید
\d
- با یک فضای خالی مطابقت دارد
\s
- با غیر اعداد مطابقت دارد
\D
- با هر غیر فضایی مطابقت دارد.
\S
m = re.match(r'\d+', '123')
print(m)
# <re.Match object; span=(0, 3), match='123'>
m = re.match(r'\d+', '123')
print(m)
# <re.Match object; span=(0, 3), match='123'>
m = re.match(r'\d+', '123', flags=re.ASCII)
print(m)
# <re.Match object; span=(0, 3), match='123'>
m = re.match(r'\d+', '123', flags=re.ASCII)
print(m)
# None
m = re.match(r'\s+', ' ') # full-width space
print(m)
# <re.Match object; span=(0, 1), match='\u3000'>
m = re.match(r'\s+', ' ', flags=re.ASCII)
print(m)
# None
به حروف بزرگ و کوچک حساس نیست:re.IGNORECASE
به طور پیش فرض، به حروف کوچک و بزرگ حساس است. برای مطابقت با هر دو، باید هر دو حروف بزرگ و کوچک را در الگو قرار دهید.
re.IGNORECASE
اگر این مشخص شده باشد، با حروف بزرگ مطابقت دارد. معادل پرچم i در عبارات معمولی استاندارد.
m = re.match('[a-zA-Z]+', 'abcABC')
print(m)
# <re.Match object; span=(0, 6), match='abcABC'>
m = re.match('[a-z]+', 'abcABC', flags=re.IGNORECASE)
print(m)
# <re.Match object; span=(0, 6), match='abcABC'>
m = re.match('[A-Z]+', 'abcABC', flags=re.IGNORECASE)
print(m)
# <re.Match object; span=(0, 6), match='abcABC'>
می توانید از کمتر یا مساوی استفاده کنید.
- پرچم درون خطی
(?i)
- مخفف
re.I
ابتدا و انتهای هر خط را مطابقت دهید:re.MULTILINEre.MULTILINE
^
کاراکترهای متا در این عبارت منظم با ابتدای رشته مطابقت دارند.
به طور پیش فرض، فقط ابتدای کل رشته مطابقت دارد، اما موارد زیر با ابتدای هر خط نیز مطابقت دارند. معادل پرچم m در عبارات منظم استاندارد.re.MULTILINE
s = '''aaa-xxx
bbb-yyy
ccc-zzz'''
print(s)
# aaa-xxx
# bbb-yyy
# ccc-zzz
result = re.findall('[a-z]+', s)
print(result)
# ['aaa', 'xxx', 'bbb', 'yyy', 'ccc', 'zzz']
result = re.findall('^[a-z]+', s)
print(result)
# ['aaa']
result = re.findall('^[a-z]+', s, flags=re.MULTILINE)
print(result)
# ['aaa', 'bbb', 'ccc']
$
با انتهای رشته مطابقت دارد. به طور پیش فرض، فقط انتهای کل رشته مطابقت دارد.re.MULTILINE
اگر این را مشخص کنید، با انتهای هر خط نیز مطابقت دارد.
result = re.findall('[a-z]+$', s)
print(result)
# ['zzz']
result = re.findall('[a-z]+$', s, flags=re.MULTILINE)
print(result)
# ['xxx', 'yyy', 'zzz']
می توانید از کمتر یا مساوی استفاده کنید.
- پرچم درون خطی
(?m)
- مخفف
re.M
چند پرچم را مشخص کنید
|
اگر می خواهید چندین پرچم را همزمان فعال کنید، از این استفاده کنید. در مورد پرچم های درون خطی، هر کاراکتر باید با یک حرف مطابق شکل زیر همراه شود.(?am)
s = '''aaa-xxx
漢漢漢-字字字
bbb-zzz'''
print(s)
# aaa-xxx
# 漢漢漢-字字字
# bbb-zzz
result = re.findall(r'^\w+', s, flags=re.M)
print(result)
# ['aaa', '漢漢漢', 'bbb']
result = re.findall(r'^\w+', s, flags=re.M | re.A)
print(result)
# ['aaa', 'bbb']
result = re.findall(r'(?am)^\w+', s)
print(result)
# ['aaa', 'bbb']
حریص و غیر حریص مسابقات
این یک مشکل کلی با عبارات منظم است، نه فقط یک مشکل با پایتون، اما من در مورد آن می نویسم زیرا باعث ایجاد مشکل در من می شود.
به طور پیش فرض، موارد زیر یک مسابقه حریصانه است که با طولانی ترین رشته ممکن مطابقت دارد.
*
+
?
s = 'aaa@xxx.com, bbb@yyy.com'
m = re.match(r'.+com', s)
print(m)
# <re.Match object; span=(0, 24), match='aaa@xxx.com, bbb@yyy.com'>
print(m.group())
# aaa@xxx.com, bbb@yyy.com
? پس از آن منجر به یک تطابق غیر حریصانه و حداقلی می شود که با کوتاه ترین رشته ممکن مطابقت دارد.
*?
+?
??
m = re.match(r'.+?com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
print(m.group())
# aaa@xxx.com
توجه داشته باشید که مطابقت حریص پیشفرض ممکن است با رشتههای غیرمنتظره مطابقت داشته باشد.