как обнаружить escape-последовательность в строке - PullRequest
3 голосов
/ 13 июня 2010

Учитывая строку с именованной строкой, чья необработанная версия имеет это значение:

\rRAWSTRING

как я могу определить, есть ли у нее escape-символ \ r?Я попробовал:

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

, но это не уловило.Я также попытался найти, например:

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

тоже не работает.Чего мне не хватает?

thx!

РЕДАКТИРОВАТЬ:

спасибо за все ответы и исправления повторяю терминологию и извиняюсь за путаницу.

ОК, если я сделаю это

print repr(line)

, то будет напечатано:

'\rSET ENABLE ACK\n'

(включая одинарные кавычки).Я перепробовал все предложения, в том числе:

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

, каждое из которых возвращает False.также пробовал:

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

каждый из которых возвращает -1

Ответы [ 6 ]

4 голосов
/ 13 июня 2010

Если:

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 голосов
/ 13 июня 2010

Чувак, кажется, ты перепробовал все, кроме самой простой вещи, lines.startswith('\r'):

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

Пока просто держись, используя repr (), \ r и r'string 'и продолжайсамая простая вещь, чтобы избежать путаницы.

1 голос
/ 13 июня 2010

Вы можете попробовать:

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

или

if line.startswith('\r'):

Последнее лучше: кажется, что вы используете repr только для того, чтобы добраться до экранированного символа.

0 голосов
/ 13 июня 2010

Простейшее:

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

Если я не совсем неправильно понимаю, что вы говорите, вам нужно искать r'\r' (или, что эквивалентно, но, возможно, немного менее читабельно, '\\r'), последовательность escape , не для '\r', сам символ возврата каретки.

0 голосов
/ 13 июня 2010
if '\r' in line:

Если это не то, что вы имеете в виду, сообщите нам ТОЧНО, что в line. Сделайте это:

print repr(line)

и скопируйте / пропустите результат в редактирование вашего вопроса.

Относительно вашей темы: обратная косая черта - это escape-символ, "\ r" - экранированный символ.

0 голосов
/ 13 июня 2010

Не совсем понятно, о чем вы спрашиваете.Вы говорите о строке, но также и о «сырой версии», и ваша строка содержит «RAWSTRING», что, по-видимому, подразумевает, что вы говорите о необработанных строках.*

Если у вас есть обычная строка с символом, представленным символом '\ r', вы можете использовать любые обычные средства для сопоставления:

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

Если вы определили фактический «raw string», это не сработает, потому что вы вводите не символ «\ r», а два символа «\» и «r»:

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

В этом случаеили в случае обычной строки, в которой есть символы '\' и 'r', и вы хотите найти эти два символа, вам необходимо выполнить поиск с использованием необработанной строки:

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

Или вы можете искать последовательность, избегая обратной косой черты:

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