在Python字符串中识别

2024-04-19 12:24:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图检索字符串中每个子字符串的索引列表。此字符串在字符串中的不同位置多次包含特殊字符\。应将\识别为字符,而不是特殊字符。当我获得子字符串的起始索引时,它跳过\并返回一个比应该的索引少的索引。任何帮助如何做到这一点将不胜感激。你知道吗

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

('ll found',0,3) ('ll found',13,16) ('ll found',22,25)

第二个指数应该是(14,17),第三个指数应该是(24,27)。而且,我不知道为什么第一个是正确的。你知道吗


Tags: 字符串textin列表forab指数字符
2条回答

Python将\解释为转义字符,就像许多其他编程语言一样。如果您想要一个文字反斜杠,请使用raw strings,并在模式中使用两倍的\,因为backslash is a regex metacharacter

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

或者,double the backslashes everywhere, and don't use raw strings。再一次,记住在正则表达式中加倍地逃逸。你知道吗

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

要查找子字符串的非重叠出现:

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)

相关问题 更多 >