我正在尝试检索字符串中每个子字符串的索引列表。该字符串在字符串中的不同位置多次包含特殊字符\。 \ \应该被识别为角色而不是特殊角色。当我获得子字符串的起始索引时,它跳过\并返回一个小于它应该的索引。如何做任何帮助将不胜感激。
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)。另外,我不确定为什么第一个是正确的。
答案 0 :(得分:3)
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)
答案 1 :(得分: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)