tklib.tkre のソースコード

"""
: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 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()