質問編集履歴

1

完成コードを掲載いたしました。

2023/10/24 01:51

投稿

Aromatibus
Aromatibus

スコア11

test CHANGED
File without changes
test CHANGED
@@ -49,3 +49,81 @@
49
49
  ### 補足情報(FW/ツールのバージョンなど)
50
50
  OS : Windows 10
51
51
 
52
+ ### 完成しました♪
53
+ おかげ様でいちおうの完成をしましたのでコードを掲載いたします。
54
+ ありがとうございました。
55
+
56
+ ```PYTHON
57
+ # Versions confirmed to work : PYTHON 3.10.11 on Windows 10
58
+ # -*- coding: utf-8 -*-
59
+
60
+
61
+ def unescape_str(target_str: str, replace_str: list) -> str:
62
+ """
63
+ エスケープシーケンスの実装
64
+
65
+ 1. "\"はエスケープシーケンス文字として扱う
66
+ 2. "\1"はグループ1の文字列として扱う
67
+ 3. グループは0から9までに対応する
68
+ 4. "\\"は"\"の文字列に置き換えられる
69
+ 5. "\\\1"は"\"とグループ1の文字列に置き換えられる
70
+ 6. エスケープシーケンスに続く文字が数字以外の場合はそのまま出力する
71
+
72
+ Args:
73
+ target_str (str): 置き換え対象の文字列
74
+ replace_str (list): "\"に続く数字(0-9) の置換対象リスト
75
+ replace_strが10未満の場合は、10になるまで空文字列で補完する
76
+ Returns:
77
+ str: 置き換え後の文字列
78
+ """
79
+ import re
80
+
81
+ # エスケープシーケンスの正規表現
82
+ # regex_str = r"(?<!\\)((?:\\)+)(\d+)?"
83
+ regex_str = r"((?:\\)+)(\d+)?" # 多分こっちで十分
84
+
85
+ # 置き換え文字列のリストの長さを10に補完する
86
+ for i in range(len(replace_str), 10):
87
+ replace_str.append("")
88
+
89
+ # エスケープシーケンスの置き換え関数
90
+ def regex_replace_rtn(matches):
91
+ matches_length = len(matches.group(1))
92
+ tail = matches.group(2)
93
+ if matches_length % 2 == 0:
94
+ if tail is None:
95
+ tail = ""
96
+ else:
97
+ if tail is None:
98
+ # (奇数の)エスケープシーケンスに続く文字が数字以外
99
+ # raise ValueError("Escape sequence followed by a non-numeric character")
100
+ tail = "\\"
101
+ else:
102
+ tail = replace_str[int(tail)]
103
+ return "\\" * (matches_length // 2) + str(tail)
104
+
105
+ result_str = re.sub(regex_str, regex_replace_rtn, target_str)
106
+ return result_str
107
+
108
+
109
+ if __name__ == "__main__":
110
+ # Test Code : Sequential escape characters
111
+ target_str = r"o:(\1) x:(\\1) o:(\\\1) x:(\\\\1) o:(\\\\\1) (\\\\\n)"
112
+ Correct_Result = r"o:(B) x:(\1) o:(\B) x:(\\1) o:(\\B) (\\\n)"
113
+ replace_str = ["A", "B", "C"] # \数字 の置換対象リスト
114
+ result_str = unescape_str(target_str, replace_str)
115
+
116
+ print(r"Target String :", target_str)
117
+ print(r"Test Result :", result_str)
118
+ print(r"Correct Result :", Correct_Result)
119
+ print(r"Match :", (result_str == Correct_Result))
120
+
121
+ # Test Code : Replacing escape characters
122
+ target_str = r"(\0) (\1) (\2) (\3) (\4) (\5) (\6) (\7) (\8) (\9) (\x)"
123
+ replace_str = ["A", "B", "C"] # \Number(0-9) replacement character list
124
+ result_str = unescape_str(target_str, replace_str)
125
+
126
+ print(r"Target String :", target_str)
127
+ print(r"Test Result :", result_str)
128
+
129
+ ```