質問するログイン新規登録

回答編集履歴

3

文章訂正

2018/01/16 23:42

投稿

KSwordOfHaste
KSwordOfHaste

スコア18406

answer CHANGED
@@ -43,7 +43,7 @@
43
43
  ---
44
44
  余談:
45
45
 
46
- 先読みは「消費されない」と言いましたが、じゃぁ`(?=a)`だけのパターンだと無限にマッチし続けるんじゃないと思しまいますが、
46
+ 先読みは「消費されない」と言いましたが、じゃぁ`(?=a)`だけのパターンだと無限にマッチし続けるんでしょう?ちょと実験てみした。
47
47
 
48
48
  ```python
49
49
  >>> it = re.finditer(r"(?=a)", "a")

2

若干訂正

2018/01/16 23:42

投稿

KSwordOfHaste
KSwordOfHaste

スコア18406

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

1

説明訂正

2018/01/16 20:21

投稿

KSwordOfHaste
KSwordOfHaste

スコア18406

answer CHANGED
@@ -23,7 +23,7 @@
23
23
  `(?<=a)` => 「後続するパターンの直前のパターンを指定するが、そのパターン自体はマッチ対象に含まない」
24
24
  `(?=a)` => 「直前のパターンの直後のパターンを指定するが、そのパターン自体はマッチ対象に含まない」
25
25
 
26
- といった感じです。「マッチ対象含まないといしたが「マッチングにチェックはさるが、マッチした部分文字列が検索済みとして消費されない」という捉え方の方が大切な点か知れせん
26
+ といった感じです。この表現(仕様の捉え方)はかなり大雑把です。使いこなすはより正確意味を把握しておた方がよいいます。後読みアサーションは既にマッチ済みであってもそ部分文字列も含めて前戻って後端部分がマッしているかをチェックしてくれ、かつ後読みアサーションにマッチした部分はマッチ結果に含めない」先読みアサーションは「後続する文字列がマッチするかをチェックするがマッチしても検索中の文字列からマッチ済みとして消費されない」というような捉え方もできると思い
27
27
 
28
28
  結局、次のようにできます。
29
29
 
@@ -38,4 +38,22 @@
38
38
  <_sre.SRE_Match object; span=(3, 4), match='a'>
39
39
  <_sre.SRE_Match object; span=(4, 5), match='b'>
40
40
 
41
- ```
41
+ ```
42
+
43
+ ---
44
+ 余談:
45
+
46
+ 先読みは「消費されない」と言いましたが、じゃぁ`(?=a)`だけのパターンだと無限にマッチし続けるんじゃないかと思ってしまいますが、
47
+
48
+ ```python
49
+ >>> it = re.finditer(r"(?=a)", "a")
50
+ >>> it.__next__()
51
+ <_sre.SRE_Match object; span=(0, 0), match=''>
52
+ >>> it.__next__()
53
+ Traceback (most recent call last):
54
+ File "<pyshell#20>", line 1, in <module>
55
+ it.__next__()
56
+ StopIteration
57
+ ```
58
+
59
+ 実際やってみるとちゃんと停止します。マッチした文字列範囲が`span=(0, 0)`となってはいますが同じ場所から検索するのでは意味がないということでちゃんと次の位置から探そうとしてくれるのですね。「ライブラリーの動作というのは合理的にうまいことできているもんだなぁ」と感心します・・・