বেশিরভাগ ক্ষেত্রে, আপনি re.compile ব্যবহার করেন বা না করেন তাতে কিছুটা পার্থক্য নেই। অভ্যন্তরীণভাবে, সমস্ত ফাংশন একটি সংকলন পদক্ষেপের পদে প্রয়োগ করা হয়:
def match(pattern, string, flags=0):
return _compile(pattern, flags).match(string)
def fullmatch(pattern, string, flags=0):
return _compile(pattern, flags).fullmatch(string)
def search(pattern, string, flags=0):
return _compile(pattern, flags).search(string)
def sub(pattern, repl, string, count=0, flags=0):
return _compile(pattern, flags).sub(repl, string, count)
def subn(pattern, repl, string, count=0, flags=0):
return _compile(pattern, flags).subn(repl, string, count)
def split(pattern, string, maxsplit=0, flags=0):
return _compile(pattern, flags).split(string, maxsplit)
def findall(pattern, string, flags=0):
return _compile(pattern, flags).findall(string)
def finditer(pattern, string, flags=0):
return _compile(pattern, flags).finditer(string)
তদ্ব্যতীত, re.compile () অতিরিক্ত দিকনির্দেশ এবং ক্যাশে যুক্তিটিকে বাইপাস করে:
_cache = {}
_pattern_type = type(sre_compile.compile("", 0))
_MAXCACHE = 512
def _compile(pattern, flags):
# internal: compile pattern
try:
p, loc = _cache[type(pattern), pattern, flags]
if loc is None or loc == _locale.setlocale(_locale.LC_CTYPE):
return p
except KeyError:
pass
if isinstance(pattern, _pattern_type):
if flags:
raise ValueError(
"cannot process flags argument with a compiled pattern")
return pattern
if not sre_compile.isstring(pattern):
raise TypeError("first argument must be string or compiled pattern")
p = sre_compile.compile(pattern, flags)
if not (flags & DEBUG):
if len(_cache) >= _MAXCACHE:
_cache.clear()
if p.flags & LOCALE:
if not _locale:
return p
loc = _locale.setlocale(_locale.LC_CTYPE)
else:
loc = None
_cache[type(pattern), pattern, flags] = p, loc
return p
Re.compile ব্যবহার করে ছোট গতির সুবিধার পাশাপাশি , লোকেরা এমন পাঠযোগ্যতা পছন্দ করে যা সম্ভাব্য জটিল প্যাটার্নের নির্দিষ্টকরণের নামকরণ করে এবং ব্যবসায়ের যুক্তি থেকে যেখানে সেখানে প্রয়োগ করা হয় সেগুলি থেকে পৃথক করে আসে:
#### Patterns ############################################################
number_pattern = re.compile(r'\d+(\.\d*)?') # Integer or decimal number
assign_pattern = re.compile(r':=') # Assignment operator
identifier_pattern = re.compile(r'[A-Za-z]+') # Identifiers
whitespace_pattern = re.compile(r'[\t ]+') # Spaces and tabs
#### Applications ########################################################
if whitespace_pattern.match(s): business_logic_rule_1()
if assign_pattern.match(s): business_logic_rule_2()
দ্রষ্টব্য, অন্য একজন উত্তরদাতাকে ভুলভাবে বিশ্বাস করেছে যে পাইক ফাইলগুলি সরাসরি সংকলিত নিদর্শনগুলি সংরক্ষণ করে; তবে, বাস্তবে পিওয়িসি লোড হওয়ার সাথে সাথে তারা প্রতিবার পুনর্নির্মাণ করা হয়:
>>> from dis import dis
>>> with open('tmp.pyc', 'rb') as f:
f.read(8)
dis(marshal.load(f))
1 0 LOAD_CONST 0 (-1)
3 LOAD_CONST 1 (None)
6 IMPORT_NAME 0 (re)
9 STORE_NAME 0 (re)
3 12 LOAD_NAME 0 (re)
15 LOAD_ATTR 1 (compile)
18 LOAD_CONST 2 ('[aeiou]{2,5}')
21 CALL_FUNCTION 1
24 STORE_NAME 2 (lc_vowels)
27 LOAD_CONST 1 (None)
30 RETURN_VALUE
উপরের বিচ্ছিন্নতাগুলি পিওয়াইসি ফাইল থেকে একটি ধারণার জন্য আসে tmp.py
:
import re
lc_vowels = re.compile(r'[aeiou]{2,5}')
re.sub