回答編集履歴

3

文章訂正

2018/01/16 23:42

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -88,7 +88,7 @@
88
88
 
89
89
 
90
90
 
91
- 先読みは「消費されない」と言いましたが、じゃぁ`(?=a)`だけのパターンだと無限にマッチし続けるんじゃないかと思ってしまいますが、
91
+ 先読みは「消費されない」と言いましたが、じゃぁ`(?=a)`だけのパターンだと無限にマッチし続けるんでしょう?ちょっ実験しみまた。
92
92
 
93
93
 
94
94
 

2

若干訂正

2018/01/16 23:42

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -115,3 +115,7 @@
115
115
 
116
116
 
117
117
  実際やってみるとちゃんと停止します。マッチした文字列範囲が`span=(0, 0)`となってはいますが同じ場所から検索するのでは意味がないということでちゃんと次の位置から探そうとしてくれるのですね。「ライブラリーの動作というのは合理的にうまいことできているもんだなぁ」と感心します・・・
118
+
119
+
120
+
121
+ ただ、そういう意味では「原因」のところに書いた「直前にマッチした部分は次の検索の対象外になる」という説明は不正確であると思います。「分かり易さのための大雑把な説明」という程度に捉えていただければと思います。

1

説明訂正

2018/01/16 20:21

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

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)`となってはいますが同じ場所から検索するのでは意味がないということでちゃんと次の位置から探そうとしてくれるのですね。「ライブラリーの動作というのは合理的にうまいことできているもんだなぁ」と感心します・・・