在Python字符串中识别\字面意思

时间:2013-02-05 04:19:56

标签: 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)。另外,我不确定为什么第一个是正确的。

2 个答案:

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