回答編集履歴

3

typo

2023/10/19 02:28

投稿

ikedas
ikedas

スコア4370

test CHANGED
@@ -31,7 +31,7 @@
31
31
 
32
32
 
33
33
  ----
34
- 名前つきグループではなく普通のグループを使う例も挙げておきます。マッチオジェクトの`group(n)`メソッドは、正規表現中の`n`番目のグループ (左括弧の位置の順番) にマッチしたものを返します。マッチしていないグループについてはNoneを返します。
34
+ 名前つきグループではなく普通のグループを使う例も挙げておきます。マッチオジェクトの`group(n)`メソッドは、正規表現中の`n`番目のグループ (左括弧の位置の順番) にマッチしたものを返します。マッチしていないグループについてはNoneを返します。
35
35
  ```python
36
36
  import re
37
37
 

2

名前つきグループを使わない例

2023/10/19 02:26

投稿

ikedas
ikedas

スコア4370

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

説明追記

2023/10/19 01:32

投稿

ikedas
ikedas

スコア4370

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