【问题标题】:how to detect an escape sequence in a string如何检测字符串中的转义序列
【发布时间】:2011-03-03 03:03:52
【问题描述】:

给定一个名为 line 的字符串,其原始版本具有此值:

\rRAWSTRING

如何检测它是否有转义字符 \r?我试过的是:

if repr(line).startswith('\r'):
    blah...

但它没有抓住它。我也试过find,比如:

if repr(line).find('\r') != -1:
    blah

也不行。我错过了什么?

谢谢!

编辑:

感谢所有回复和对术语的更正,并对造成的混乱表示歉意。

好的,如果我这样做

print repr(line)

那么它打印的是:

'\rSET ENABLE ACK\n'

(包括单引号)。我已经尝试了所有建议,包括:

line.startswith(r'\r')
line.startswith('\\r') 

每个都返回 False。也试过了:

line.find(r'\r')
line.find('\\r')

每个都返回 -1

【问题讨论】:

  • 您缺少的是 repr(line) 将包含 '\\r', (ASCII 92, 114),而不是 '\r' (ASCII 13)。
  • 换句话说,您需要line.find('\r')repr(line).find('\\r')。你看出区别了吗?

标签: python parsing string escaping


【解决方案1】:

如果:

print repr(line)

返回:

'\rSET ENABLE ACK\n'

然后:

line.find('\r')
line.startswith('\r')
'\r' in line

是您正在寻找的。示例:

>>> line = '\rSET ENABLE ACK\n'
>>> print repr(line)
'\rSET ENABLE ACK\n'
>>> line.find('\r')
0
>>> line.startswith('\r')
True
>>> '\r' in line
True

repr() 返回一个显示字符串。它实际上包含您在打印该行时看到的引号和反斜杠:

>>> print line
SET ENABLE ACK

>>> print repr(line)
'\rSET ENABLE ACK\n'
>>> print len(line)
16
>>> print len(repr(line))
20

【讨论】:

    【解决方案2】:

    伙计,除了最简单的事情,你似乎什么都试过了,lines.startswith('\r')

    >>> line = '\rSET ENABLE ACK\n'
    >>> line.startswith('\r')
    True
    >>> '\rSET ENABLE ACK\n'.startswith('\r')
    True
    

    现在,请继续使用 repr()、\r 和 r'string',并使用最简单的方法来避免混淆。

    【讨论】:

    • 是的,你是对的。我首先通过使用 repr() 打印找到了 \r,所以我想在搜索它时需要使用 repr()。
    【解决方案3】:

    你可以试试:

    if repr(line).startswith(r'\r'):
    

    if line.startswith('\r'):
    

    后者更好:似乎您使用 repr 只是为了获取转义字符。

    【讨论】:

    • 我认为你和我对 OP 问题的理解不同(不足为奇,因为他使用了奇怪的术语——例如,\r 不可能是转义 字符 因为他一直这么称呼它,所以我认为当他这么说时,他的意思是逃避序列)。我认为他的字符串是r'\rRAWSTRING'(为什么他如此坚持“原始”部分?)而您似乎认为它是'\rRAWSTRING'(让所有“原始”引用完全神秘)。
    【解决方案4】:

    您的要求并不完全清楚。你说的是一个字符串,也是一个“原始版本”,而你的字符串包含“RAWSTRING”,这似乎暗示你在谈论原始字符串。

    这些都不是完全相同的东西。

    如果你有一个普通的字符串,里面有'\r'代表的字符,那么你可以用任何普通的方式来匹配:

    >>> "\rastring".find('\r')
    0
    >>> 
    

    如果您定义了一个 实际“原始字符串”,那将不起作用,因为您输入的不是 '\r' 字符,而是两个字符 '\' 和 'r' :

    >>> r"\rastring".find('\r')
    -1
    >>>
    

    在这种情况下,或者对于恰好有字符“\”和“r”的普通字符串,并且您想要找到这两个字符,您需要使用原始字符串进行搜索:

    >>> r"\rastring".find(r'\r')
    0
    >>> 
    

    或者您可以通过转义反斜杠本身来搜索序列:

    >>> r"\rastring".find('\\r')
    0
    >>> 
    

    【讨论】:

      【解决方案5】:
      if '\r' in line:
      

      如果这不是您的意思,请准确告诉我们line 中的内容。这样做:

      print repr(line)
      

      并将结果复制/粘贴到您的问题的编辑中。

      你的主题:反斜杠是一个转义字符,“\r”是一个转义字符。

      【讨论】:

      • 感谢所有回复和更正术语,并抱歉造成混淆。好的,如果我这样做“打印 repr(line)”,那么它返回的是:'\rSET ENABLE ACK\n'(包括单引号)。我已经尝试了上面的所有建议,例如 line.startswith(r'\r') 返回 False,line.startswith('\\r') 以及 line.find(r'\r')和 line.find('\\r') (find 返回 -1)。
      • 那么是时候尝试一些可行的建议了,比如if '\r' in line:if line.startswith('\r'):
      【解决方案6】:

      最简单的:

      >>> s = r'\rRAWSTRING'
      >>> s.startswith(r'\r')
      True
      

      除非我严重误解了你在说什么,否则你需要寻找 r'\r'(或者,等效但可能有点不可读,'\\r'),转义序列对于'\r',回车符本身。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-02
        • 2013-02-17
        • 2010-11-02
        • 2010-09-16
        相关资源
        最近更新 更多