回答編集履歴
3
typo
test
CHANGED
@@ -31,7 +31,7 @@
|
|
31
31
|
|
32
32
|
|
33
33
|
----
|
34
|
-
名前つきグループではなく普通のグループを使う例も挙げておきます。マッチオ
|
34
|
+
名前つきグループではなく普通のグループを使う例も挙げておきます。マッチオブジェクトの`group(n)`メソッドは、正規表現中の`n`番目のグループ (左括弧の位置の順番) にマッチしたものを返します。マッチしていないグループについてはNoneを返します。
|
35
35
|
```python
|
36
36
|
import re
|
37
37
|
|
2
名前つきグループを使わない例
test
CHANGED
@@ -30,4 +30,31 @@
|
|
30
30
|
Python公式マニュアルの「re - 正規表現操作」の[正規表現の例](https://docs.python.org/ja/3.10/library/re.html#regular-expression-examples)にある「トークナイザを書く」も見てみて下さい。
|
31
31
|
|
32
32
|
|
33
|
+
----
|
34
|
+
名前つきグループではなく普通のグループを使う例も挙げておきます。マッチオプジェクトの`group(n)`メソッドは、正規表現中の`n`番目のグループ (左括弧の位置の順番) にマッチしたものを返します。マッチしていないグループについてはNoneを返します。
|
35
|
+
```python
|
36
|
+
import re
|
33
37
|
|
38
|
+
def unescape(escaped_str):
|
39
|
+
tok_regex = r'(\\1)|(\\\\)|(\\.)|(.)'
|
40
|
+
for mo in re.finditer(tok_regex, escaped_str):
|
41
|
+
if mo.group(1) is not None:
|
42
|
+
kind = 'GROUP1'
|
43
|
+
value = 'A'
|
44
|
+
elif mo.group(2) is not None:
|
45
|
+
kind = 'REVSOL'
|
46
|
+
value = '\\'
|
47
|
+
elif mo.group(3) is not None:
|
48
|
+
kind = 'ESCAPED'
|
49
|
+
value = mo.group()[1:]
|
50
|
+
else:
|
51
|
+
kind = None
|
52
|
+
value = mo.group()
|
53
|
+
yield kind, value
|
54
|
+
|
55
|
+
if __name__ == '__main__':
|
56
|
+
in_str = input()
|
57
|
+
for k, v in unescape(in_str):
|
58
|
+
print(f'{k}: {v}')
|
59
|
+
```
|
60
|
+
|
1
説明追記
test
CHANGED
@@ -25,7 +25,7 @@
|
|
25
25
|
print(f'{k}: {v}')
|
26
26
|
```
|
27
27
|
|
28
|
-
5行目でテキストのマッチを繰り返すたびに、グループ1、エスケープされたバックスラッシュ、エスケープされた文字、普通の文字、のいずれかにマッチします。名前つきグループを使うことでどれにマッチしたか区別しています。
|
28
|
+
5行目でテキストのマッチを繰り返すたびに、グループ1、エスケープされたバックスラッシュ、エスケープされた文字、普通の文字、のいずれかにマッチします。名前つきグループを使うことでどれにマッチしたか区別しています (普通の文字のグループ`(.)`は`|`による選択肢の最後に書く必要があります。そうしないとエスケープ文字にマッチしてしまいます)。
|
29
29
|
|
30
30
|
Python公式マニュアルの「re - 正規表現操作」の[正規表現の例](https://docs.python.org/ja/3.10/library/re.html#regular-expression-examples)にある「トークナイザを書く」も見てみて下さい。
|
31
31
|
|