1

文字列内の各部分文字列のインデックスのリストを取得しようとしています。この文字列には、特殊文字 \ が文字列内のさまざまな場所に数回含まれています。\ は、特殊文字としてではなく、文字として認識される必要があります。部分文字列の開始インデックスを取得すると、\ をスキップして本来あるべきインデックスより 1 つ少ないインデックスを返します。これを行う方法についての助けをいただければ幸いです。

text = "ab\fx*abcdfansab\fasdafdab\f664s"
for m in re.finditer( 'ab\f', text ):
print( 'll found', m.start(), m.end() )

('見つかる', 0, 3) ('見つかる', 13, 16) ('見つかる', 22, 25)

2 番目のインデックスは (14, 17) で、3 番目のインデックスは (24, 27) にする必要があります。また、なぜ最初のものが正しいのかわかりません。

4

2 に答える 2

3

\他の多くのプログラミング言語と同様に、Python は をエスケープ文字として解釈します。バックスラッシュは正規表現のメタ文字であるため、リテラルのバックスラッシュが必要な場合は、生の文字列\を使用し、パターン内でを 2 倍にします。

>>> text = r'ab\fx*abcdfansab\fasdafdab\f664s'
>>> for m in re.finditer( r'ab\\f', text ):
...    print( 'll found', m.start(), m.end() )
...
('ll found', 0, 4)
('ll found', 14, 18)
('ll found', 24, 28) 

または、どこでもバックスラッシュを 2 倍にし、生の文字列を使用しないでください。繰り返しますが、正規表現で二重にエスケープすることを忘れないでください。

>>> text = 'ab\\fx*abcdfansab\\fasdafdab\\f664s'
>>> for m in re.finditer( 'ab\\\\f', text ):
...     print( 'll found', m.start(), m.end() )
... 
('ll found', 0, 4)
('ll found', 14, 18)
('ll found', 24, 28)
于 2013-02-05T04:24:20.320 に答える
0

重複しない部分文字列を見つけるには:

haystack = r"ab\fx*abcdfansab\fasdafdab\f664s" # raw-literal to interpret
                                               # the backslash literally
needle = r"ab\f"
n = len(needle)
i = -n
while True:
    i = haystack.find(needle, i+n)
    if i == -1:
        break
    print((i, i+n))

または正規表現を使用して:

import re

print("\n".join(str((m.start(), m.end()))
                for m in re.finditer(re.escape(needle), haystack)))

どちらも同じ出力を生成します。

(0, 4)
(14, 18)
(24, 28)
于 2013-02-05T04:56:15.217 に答える