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)

第二个索引应该是 (14, 17) 和第三个 (24, 27)。另外,我不确定为什么第一个是正确的。

4

2 回答 2

3

\与许多其他编程语言一样,Python 将 解释为转义字符。如果你想要一个文字反斜杠,请使用原始字符串,并且\在模式中加倍,因为反斜杠是一个正则表达式元字符

>>> 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) 

或者,将反斜杠加倍,不要使用原始字符串。同样,请记住在正则表达式中双重转义。

>>> 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 回答