2010-03-11 27 views
29

w pythonie, biorąc pod uwagę zmienną, która zawiera ciąg, czy istnieje szybki sposób na przeniesienie go do innej surowej zmiennej łańcuchowej?rzucanie surowych ciągów python

następujący kod powinien zilustrować, co im po ...

def checkEqual(x, y): 
    print True if x==y else False 

line1 = "hurr..\n..durr" 
line2 = r"hurr..\n..durr" 
line3 = "%r"%line1 

print "%s \n\n%s \n\n%s \n" % (line1, line2, line3) 

checkEqual(line2, line3)  #outputs False 

checkEqual(line2, line3[1:-1]) #outputs True 

Najbliższy znalazłem tak daleko jest flaga formatowania% R, który wydaje się powrót surowego ciąg aczkolwiek wewnątrz pojedynczych cudzysłowów. Czy jest jakiś prostszy sposób na zrobienie tego, jak coś w rodzaju line3 = raw(line1)?

+0

Proszę nie używać słowa "cast". Python nie ma czegoś takiego. Chcesz "przekształcić" lub "przekonwertować" surowy ciąg na inny ciąg. "szybkie" nie ma z tym nic wspólnego. –

+2

'checkEqual' może po prostu być' return x == y' – pradyunsg

+1

Dzięki @Schoolboy za wskazanie tego. Zawsze mnie spala, gdy widzę coś tak niepotrzebnego jak "print True if True else False":/ – OozeMeister

Odpowiedz

61
"hurr..\n..durr".encode('string-escape') 
+6

. str.encode() z różnymi kodekami jest dokładnie tym, za czym byłem. "Unicode-escape" faktycznie rozwiązuje kolejny problem, który miałem. Pozdrawiam – dave

+1

To nie działa dla '\ w' itp. –

+7

Otrzymuję błąd w Python3.3 LookupError: nieznane kodowanie: string-escape – Erik

3

Jeszcze innym sposobem:

>>> s = "hurr..\n..durr" 
>>> print repr(s).strip("'") 
hurr..\n..durr 
+0

To nie zadziała, jeśli 's' ma' '' in it –

+0

Powinno być ok, jeśli '' 'znajduje się w środku łańcucha, ale na pewno nie jest solidne (na przykład z ciągami Unicode) . – Seth

0
>>> v1 = 'aa\1.js' 
>>> re.sub(r'(.*)\.js', repr(v1).strip("'"), 'my.js', 1) 
'aa\\x01.js 

Ale

>>> re.sub(r'(.*)\.js', r'aa\1.js', 'my.js', 1) 
'aamy.js' 

I

>>> re.sub(r'(.*)\.js', raw(v1), 'my.js', 1) 
'aamy.js' 

i lepiej surowe Metoda REALIZACJA ntacja

def raw(text): 
    """Returns a raw string representation of text""" 
    return "".join([escape_dict.get(char,char) for char in text]) 
1

Powyżej pokazano sposób kodowania.

'hurr..\n..durr'.encode('string-escape') 

W ten sposób zostanie zdekodowany.

r'hurr..\n..durr'.decode('string-escape') 

Przykł.

In [12]: print 'hurr..\n..durr'.encode('string-escape') 
hurr..\n..durr 

In [13]: print r'hurr..\n..durr'.decode('string-escape') 
hurr.. 
..durr 

Pozwala to "rzutować/przekształcać nieprzetworzone ciągi" w obu kierunkach. Praktyczny przypadek to taki, w którym json zawiera surowy ciąg i chcę go ładnie wydrukować.

{ 
    "Description": "Some lengthy description.\nParagraph 2.\nParagraph 3.", 
    ... 
} 

Chciałbym zrobić coś takiego.

print json.dumps(json_dict, indent=4).decode('string-escape') 
Powiązane problemy