質問編集履歴
1
完成コードを掲載いたしました。
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
|
+
```
|