add regex and excludes
This commit is contained in:
51
game_backuper/regexp.py
Normal file
51
game_backuper/regexp.py
Normal file
@@ -0,0 +1,51 @@
|
||||
try:
|
||||
from game_backuper._pcre2 import PCRE2, Option as PCRE2Option, MatchOption
|
||||
have_pcre2 = True
|
||||
except ImportError:
|
||||
have_pcre2 = False
|
||||
from enum import IntFlag
|
||||
from re import I as REI, compile as re_comp
|
||||
|
||||
|
||||
class RegexFlag(IntFlag):
|
||||
I = 1 # noqa: E741
|
||||
IGNORECASE = 1
|
||||
|
||||
|
||||
class Regex:
|
||||
def __init__(self, r: str, flags: RegexFlag = 0, use_pcre2: bool = False):
|
||||
if have_pcre2 and use_pcre2:
|
||||
opt = 0
|
||||
if flags & RegexFlag.I:
|
||||
opt = opt | PCRE2Option.PCRE2_CASELESS
|
||||
self._re = PCRE2(r)
|
||||
self._use_pcre2 = True
|
||||
else:
|
||||
if use_pcre2:
|
||||
from sys import stderr
|
||||
stderr.write("Can not load pcre2.\n")
|
||||
self._use_pcre2 = False
|
||||
opt = 0
|
||||
if flags & RegexFlag.I:
|
||||
opt = opt | REI
|
||||
self._re = re_comp(r)
|
||||
|
||||
def match(self, s: str, startpos: int = 0):
|
||||
if self._use_pcre2:
|
||||
return self._re.match(s, MatchOption.PCRE2_ANCHORED, startpos)
|
||||
else:
|
||||
return self._re.match(s, startpos)
|
||||
|
||||
def match_only(self, s: str, startpos: int = 0) -> bool:
|
||||
if self._use_pcre2:
|
||||
return self._re.match(s, MatchOption.PCRE2_ANCHORED, startpos, True) # noqa: E501
|
||||
else:
|
||||
return False if self._re.match(s, startpos) is None else True
|
||||
|
||||
|
||||
def wildcards_to_regex(s: str, **k):
|
||||
for i in ['\\', '$', '(', ')', '+', '.', '[', '^', '{', '|']:
|
||||
s = s.replace(i, f"\\{i}")
|
||||
s = s.replace("*", ".*")
|
||||
s = s.replace("?", ".")
|
||||
return Regex(s, **k)
|
||||
Reference in New Issue
Block a user