回答編集履歴
3
文章訂正
test
CHANGED
@@ -88,7 +88,7 @@
|
|
88
88
|
|
89
89
|
|
90
90
|
|
91
|
-
先読みは「消費されない」と言いましたが、じゃぁ`(?=a)`だけのパターンだと無限にマッチし続けるん
|
91
|
+
先読みは「消費されない」と言いましたが、じゃぁ`(?=a)`だけのパターンだと無限にマッチし続けるんでしょうか?ちょっと実験してみました。
|
92
92
|
|
93
93
|
|
94
94
|
|
2
若干訂正
test
CHANGED
@@ -115,3 +115,7 @@
|
|
115
115
|
|
116
116
|
|
117
117
|
実際やってみるとちゃんと停止します。マッチした文字列範囲が`span=(0, 0)`となってはいますが同じ場所から検索するのでは意味がないということでちゃんと次の位置から探そうとしてくれるのですね。「ライブラリーの動作というのは合理的にうまいことできているもんだなぁ」と感心します・・・
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
ただ、そういう意味では「原因」のところに書いた「直前にマッチした部分は次の検索の対象外になる」という説明は不正確であると思います。「分かり易さのための大雑把な説明」という程度に捉えていただければと思います。
|
1
説明訂正
test
CHANGED
@@ -48,7 +48,7 @@
|
|
48
48
|
|
49
49
|
|
50
50
|
|
51
|
-
といった感じです。
|
51
|
+
といった感じです。この表現(仕様の捉え方)はかなり大雑把です。使いこなすにはより正確な意味を把握しておいた方がよいと思います。後読みアサーションは「既にマッチ済みであってもその部分文字列も含めて前に戻って後端部分がマッチしているかをチェックしてくれ、かつ後読みアサーションにマッチした部分はマッチ結果に含めない」先読みアサーションは「後続する文字列がマッチするかをチェックするがマッチしても検索中の文字列からマッチ済みとして消費されない」というような捉え方もできると思います。
|
52
52
|
|
53
53
|
|
54
54
|
|
@@ -79,3 +79,39 @@
|
|
79
79
|
|
80
80
|
|
81
81
|
```
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
---
|
86
|
+
|
87
|
+
余談:
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
先読みは「消費されない」と言いましたが、じゃぁ`(?=a)`だけのパターンだと無限にマッチし続けるんじゃないかと思ってしまいますが、
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
```python
|
96
|
+
|
97
|
+
>>> it = re.finditer(r"(?=a)", "a")
|
98
|
+
|
99
|
+
>>> it.__next__()
|
100
|
+
|
101
|
+
<_sre.SRE_Match object; span=(0, 0), match=''>
|
102
|
+
|
103
|
+
>>> it.__next__()
|
104
|
+
|
105
|
+
Traceback (most recent call last):
|
106
|
+
|
107
|
+
File "<pyshell#20>", line 1, in <module>
|
108
|
+
|
109
|
+
it.__next__()
|
110
|
+
|
111
|
+
StopIteration
|
112
|
+
|
113
|
+
```
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
実際やってみるとちゃんと停止します。マッチした文字列範囲が`span=(0, 0)`となってはいますが同じ場所から検索するのでは意味がないということでちゃんと次の位置から探そうとしてくれるのですね。「ライブラリーの動作というのは合理的にうまいことできているもんだなぁ」と感心します・・・
|