"""
:doc:`tkre_usage`
tkreモジュール
概要:
正規表現操作を簡略化するユーティリティ関数とクラスを提供します。
詳細説明:
Python標準のreモジュールとshlexモジュールをラップし、
一般的な正規表現パターンマッチング、検索、置換、分割などの
操作を容易に行えるように設計されています。
グローバル変数`last_res`を用いて、直前のマッチ結果を保持する機能も提供します。
"""
import re
import shlex
from tklib.tkobject import tkObject
"""
sublist = { # 置換元文字列:置換する文字列
's1': 'target1',
's2': 'target2',
's3': 'target3'
}
repatter = re.compile(pattern)
matchOB = repatter.match(text)
print matchOB.group() # マッチした文字列を返す # ca
print matchOB.start() # マッチの開始位置を返す # 0
print matchOB.end() # マッチの終了位置を返す # 2
print matchOB.span() # マッチの位置(start, end)を含むタプルを返す # (0, 2)
def SubstituteAll(self, sublist, str):
table = str.maketrans(sublist)
return str.translate(table)
"""
last_res = None
[ドキュメント]
def GetReg_flag(flag = ''):
"""
概要: 指定されたフラグ文字列からreモジュール用の正規表現フラグを生成します。
詳細説明:
入力された文字列に含まれる文字に基づいて、re.IGNORECASE (i),
re.DOTALL (s), re.MULTILINE (m), re.ASCII (a), re.LOCALE (l),
re.VERBOSE (x) のいずれかのフラグをビットORで結合します。
:param flag: フラグ文字を含む文字列 (例: 'im')。デフォルトは空文字列。
:type flag: str, optional
:returns: reモジュールで使用できる正規表現フラグのビットマスク。
:rtype: int
"""
re_flag = 0
if 'i' in flag:
re_flag |= re.IGNORECASE
if 's' in flag:
re_flag |= re.DOTALL
if 'm' in flag:
re_flag |= re.MULTILINE
if 'a' in flag:
re_flag |= re.ASCII
if 'l' in flag:
re_flag |= re.LOCALE
if 'x' in flag:
re_flag |= re.VERBOSE
return re_flag
[ドキュメント]
def DelQuote(str):
"""
概要: 文字列の先頭と末尾にある引用符(シングルクォートまたはダブルクォート)を削除します。
詳細説明:
文字列がシングルクォートまたはダブルクォートで両端を囲まれている場合に限り、
その引用符を削除します。内側の引用符は削除されません。
文字列の前後の空白は`strip()`で除去されます。
:param str: 引用符を削除する対象の文字列。
:type str: str
:returns: 引用符が削除された文字列。
:rtype: str
"""
s = str.strip()
# print("s [{}]".format(s))
if Search('^\'', s) and Search('\'$', s):
s = Sub('^\'', '', s)
s = Sub('\'$', '', s)
elif Search('^\"', s) and Search('\"$', s):
s = Sub('^\"', '', s)
s = Sub('\"$', '', s)
return s
[ドキュメント]
def DelSpace(str):
"""
概要: 文字列の先頭と末尾にある空白文字を削除します。
詳細説明:
Pythonのstr.strip()メソッドを呼び出し、文字列の両端から空白文字を除去します。
:param str: 空白文字を削除する対象の文字列。
:type str: str
:returns: 先頭と末尾の空白文字が削除された文字列。
:rtype: str
"""
return str.strip()
[ドキュメント]
def DelTopSpace(str):
"""
概要: 文字列の先頭にある空白文字を削除します。
詳細説明:
Pythonのstr.lstrip()メソッドを呼び出し、文字列の先頭から空白文字を除去します。
:param str: 先頭の空白文字を削除する対象の文字列。
:type str: str
:returns: 先頭の空白文字が削除された文字列。
:rtype: str
"""
return str.lstrip()
[ドキュメント]
def DelLastSpace(str):
"""
概要: 文字列の末尾にある空白文字を削除します。
詳細説明:
Pythonのstr.rstrip()メソッドを呼び出し、文字列の末尾から空白文字を除去します。
:param str: 末尾の空白文字を削除する対象の文字列。
:type str: str
:returns: 末尾の空白文字が削除された文字列。
:rtype: str
"""
return str.rstrip()
[ドキュメント]
def Split(reg, str):
"""
概要: 正規表現パターンに基づいて文字列を分割します。
詳細説明:
re.split関数をラップし、指定された正規表現`reg`にマッチする区切り文字で
文字列`str`を分割します。
:param reg: 分割に使用する正規表現パターン。
:type reg: str
:param str: 分割対象の文字列。
:type str: str
:returns: 分割された部分文字列のリスト。
:rtype: list of str
"""
return re.split(reg, str)
[ドキュメント]
def shSplit(reg, str):
"""
概要: shlexモジュールを使用して文字列をシェル風に分割します。
詳細説明:
shlex.split関数をラップし、シェルの構文規則に従って文字列をトークンに分割します。
この実装では、最初の引数`reg`が分割対象の文字列、
2番目の引数`str`が`shlex.split`の`comments`引数として渡されます。
:param reg: 分割対象の文字列。`shlex.split`の第1引数として使用されます。
:type reg: str
:param str: `shlex.split`の`comments`引数として渡される文字列。
:type str: str
:returns: 分割されたトークンのリスト。
:rtype: list of str
"""
return shlex.split(reg, str)
[ドキュメント]
def Sub(reg, target, str, n = 0):
"""
概要: 正規表現にマッチする部分文字列を置換します。
詳細説明:
re.sub関数をラップし、文字列`str`内で正規表現`reg`にマッチする部分を
`target`で置換します。置換回数を`n`で指定できます。
:param reg: 検索および置換に使用する正規表現パターン。
:type reg: str
:param target: マッチした部分を置換する文字列。
:type target: str
:param str: 置換対象の文字列。
:type str: str
:param n: 置換する最大回数。0の場合は全て置換します。デフォルトは0。
:type n: int, optional
:returns: 置換後の文字列。
:rtype: str
"""
return re.sub(reg, target, str, n)
[ドキュメント]
def SubN(reg, target, str, n = 0):
"""
概要: 正規表現にマッチする部分文字列を置換し、置換回数を返します。
詳細説明:
re.subn関数をラップし、文字列`str`内で正規表現`reg`にマッチする部分を
`target`で置換します。置換後の文字列と、実際に置換が行われた回数のタプルを返します。
置換回数を`n`で指定できます。
:param reg: 検索および置換に使用する正規表現パターン。
:type reg: str
:param target: マッチした部分を置換する文字列。
:type target: str
:param str: 置換対象の文字列。
:type str: str
:param n: 置換する最大回数。0の場合は全て置換します。デフォルトは0。
:type n: int, optional
:returns: 置換後の文字列と置換回数のタプル。
:rtype: tuple of (str, int)
"""
return re.subn(reg, target, str, n)
[ドキュメント]
def get_result():
"""
概要: 直前の正規表現操作の結果を返します。
詳細説明:
`Search`, `Match`, `FindAll`, `FindIter`などの関数によって設定された
グローバル変数`last_res`の値を返します。
:returns: 直前の正規表現操作の結果。結果の形式は操作によって異なります。
:rtype: list or None
"""
return last_res
[ドキュメント]
def Search(reg, str, flag = ''):
"""
概要: 文字列の任意の場所で正規表現の最初のマッチを検索します。
詳細説明:
re.search関数をラップし、文字列`str`内で正規表現`reg`に最初にマッチする箇所を検索します。
マッチした場合、マッチオブジェクトから抽出されたグループのリストを返します。
マッチしない場合はNoneを返します。
この関数の結果はグローバル変数`last_res`にも保存されます。
:param reg: 検索する正規表現パターン。
:type reg: str
:param str: 検索対象の文字列。
:type str: str
:param flag: reモジュールのフラグ文字列 (例: 'im')。GetReg_flagによって変換されます。
:type flag: str, optional
:returns: マッチしたグループのリスト、またはマッチしない場合はNone。
:rtype: list of str or None
"""
global last_res
re_flag = GetReg_flag(flag)
# reg2 = re.sub(r'([\[\]\(\)])', '\\' + '\1', reg)
# print("s, reg=", reg, reg2)
# exit()
match = re.search(reg, str, re_flag)
s = []
if match is None:
last_res = None
return last_res
i = 0
while 1:
try:
str = match.group(i)
s.append(str)
except:
last_res = s
return last_res
i += 1
last_res = s
return last_res
[ドキュメント]
def Match(reg, str, flag = ''):
"""
概要: 文字列の先頭から正規表現のマッチを試みます。
詳細説明:
re.match関数をラップし、文字列`str`の先頭で正規表現`reg`にマッチするかを試みます。
マッチした場合、マッチオブジェクトから抽出されたグループのリストを返します。
マッチしない場合は空のリストを返します。
この関数の結果はグローバル変数`last_res`にも保存されます。
:param reg: 検索する正規表現パターン。
:type reg: str
:param str: 検索対象の文字列。
:type str: str
:param flag: reモジュールのフラグ文字列 (例: 'im')。GetReg_flagによって変換されます。
:type flag: str, optional
:returns: マッチしたグループのリスト、またはマッチしない場合は空のリスト。
:rtype: list of str
"""
global last_res
re_flag = GetReg_flag(flag)
# reg2 = re.sub(r'([\[\]\(\)])', '\\' + '\1', reg)
# print("m, reg=", reg, reg2)
# exit()
match = re.match(reg, str, re_flag)
s = []
if match is None:
last_res = s
return last_res
i = 0
while 1:
try:
str = match.group(i)
s.append(str)
except:
return s
i += 1
last_res = s
return last_res
[ドキュメント]
def FindAll(reg, str, flag = ''):
"""
概要: 正規表現にマッチする全てのグループを検索し、リストとして返します。
詳細説明:
re.findall関数を実行し、その結果からマッチしたグループを抽出することを試みます。
抽出されたグループはリストとして返されます。
この関数の結果はグローバル変数`last_res`にも保存されます。
:param reg: 検索する正規表現パターン。
:type reg: str
:param str: 検索対象の文字列。
:type str: str
:param flag: reモジュールのフラグ文字列 (例: 'im')。GetReg_flagによって変換されます。
:type flag: str, optional
:returns: マッチしたグループのリスト。
:rtype: list of str
"""
global last_res
re_flag = GetReg_flag(flag)
match = re.findall(reg, str, re_flag)
s = []
if match is None:
last_res = s
return last_res
i = 0
while 1:
try:
str = match.group(i)
s.append(str)
except:
return s
i += 1
last_res = s
return last_res
[ドキュメント]
def FindIter(reg, str, flag = ''):
"""
概要: 正規表現にマッチする全ての非重複部分文字列またはグループをイテレータとして検索します。
詳細説明:
re.finditer関数をラップし、正規表現`reg`にマッチする全ての箇所を検索します。
各マッチについて、マッチオブジェクトから抽出されたグループのリストを作成し、
それらをさらにリストにまとめて返します。
この関数の結果はグローバル変数`last_res`にも保存されます。
:param reg: 検索する正規表現パターン。
:type reg: str
:param str: 検索対象の文字列。
:type str: str
:param flag: reモジュールのフラグ文字列 (例: 'im')。GetReg_flagによって変換されます。
:type flag: str, optional
:returns: 各マッチのグループのリストのリスト。
:rtype: list of list of str
"""
global last_res
re_flag = GetReg_flag(flag)
iter = re.finditer(reg, str, re_flag)
# print("iter=", iter)
# print("reg=", reg)
# print("str=", str)
# print("re_flag=", re_flag)
s = []
if iter is None:
last_res = s
return last_res
for match in iter:
# print("match=", match)
s1 = []
i = 0
while 1:
try:
ss = match.group(i)
# print("i=", i, " ss=", ss)
s1.append(ss)
except:
break
i += 1
s.append(s1)
# print("s=", s)
last_res = s
return s
[ドキュメント]
class tkRegExp(tkObject):
"""
概要: 正規表現操作を提供するtklibのラッパークラス。
詳細説明:
tklibのtkObjectを継承し、正規表現による文字列検索機能を提供します。
特に`FindIter`メソッドを通じて、モジュールレベルの`FindIter`関数を
オブジェクト指向のインターフェースで利用できるようにします。
"""
def __init__(self, **args):
"""
概要: tkRegExpオブジェクトを初期化します。
詳細説明:
正規表現オブジェクトのインスタンスを作成します。
現在、初期化時に特別な設定は行いません。
:param args: キーワード引数(現在未使用)。
:type args: dict
"""
self.method = None
def __del__(self):
"""
概要: tkRegExpオブジェクトが破棄される際に呼び出されます。
詳細説明:
現在、デストラクタでは特別なクリーンアップ処理は行われません。
"""
pass
def __str__(self):
"""
概要: オブジェクトの文字列表現を返します。
詳細説明:
オブジェクトのクラスパスを文字列表現として返します。
:returns: オブジェクトのクラスパス。
:rtype: str
"""
return self.ClassPath()
[ドキュメント]
def FindIter(self, reg, str, flag = ''):
"""
概要: 正規表現にマッチする全ての非重複部分文字列またはグループをイテレータとして検索します。
詳細説明:
モジュールレベルの`FindIter`関数を呼び出し、正規表現`reg`にマッチする
全ての箇所を検索します。各マッチについて、マッチオブジェクトから抽出された
グループのリストを作成し、それらをさらにリストにまとめて返します。
:param reg: 検索する正規表現パターン。
:type reg: str
:param str: 検索対象の文字列。
:type str: str
:param flag: reモジュールのフラグ文字列 (例: 'im')。GetReg_flagによって変換されます。
:type flag: str, optional
:returns: 各マッチのグループのリストのリスト。
:rtype: list of list of str
"""
return FindIter(reg, str, flag)
[ドキュメント]
def main():
"""
概要: モジュール内の関数の動作例を示すメインエントリポイント。
詳細説明:
この関数は、`DelQuote`、`FindIter`などのモジュール内の主要な関数の
使用方法を示すためのサンプルコードを含んでいます。
スクリプトが直接実行された場合に呼び出されます。
"""
str = ' \" abc\" '
l = DelQuote(str)
print("str [{}]".format(str))
print("DelQuote: [{}]".format(l))
str = ' \'\" abc\"\' '
l = DelQuote(str)
print("")
print("str [{}]".format(str))
print("DelQuote: [{}]".format(l))
str = 'Title = abc def\n' \
'Name = dkl\n'
print("")
print("str:")
print(str)
print("")
print("module")
l = FindIter(r'^\s*(\S+)\s*=\s*(.*)\s*$', str, 'im')
print(" l(flag=im):", l)
l = FindIter(r'^\s*(\S+)\s*=\s*(.*)\s*$', str, 'is')
print(" l(flag=is):", l)
print("")
print("class")
reg = tkRegExp()
l = reg.FindIter(r'^\s*(\S+)\s*=\s*(.*)\s*$', str, 'im')
print(" l(flag=im):", l)
l = reg.FindIter(r'^\s*(\S+)\s*=\s*(.*)\s*$', str, 'isx')
print(" l(flag=isx):", l)
if __name__ == "__main__":
main()