2011-04-24 9 views
3

나는 데 문제가 교체 얻는 데에 문자열에서 \를 제거하려면 어떻게() 나는 my_string.replace('\\', '')re.sub('\\', '', my_string)을 시도했지만, 어느 하나가 작동내가 파이썬

작동합니다.

\ 내가 백 슬래시의 이스케이프 코드라고 생각했는데 잘못인가?

'<[email protected]\x82\xb1\x82\xea\x82\xa9\x82\xe7\x8c\xa9\x82\xa6\x82\xe9\x82\xbe\x82\xeb\x82\xa4>'

또는 print my_string <[email protected]???ꂩ?猩???邾?낤>

예, 가비지 같이하기로했다, 그러나 나는 오히려 얻을 것 같은 는 문제의 문자열은

보이는 '<[email protected]e82eb82a4>'

+0

관련 : http://stackoverflow.com/questions/92438/stripping-non-printable-characters-from-a-string-in-python – icktoofay

+0

정말 도움이되지 않습니다. 내 문자열에 ascii 문자 만 포함 시키길 원하지만 비 ASCII 문자를 완전히 스트라이프하지 않고 ASCII 리터럴로 만들고 싶습니다. –

+0

내가 사용할 수있는 정규식 검색 문자열을 대단히 단순화하기 때문에 나는 ascii를 원한다. 나는 \ '[\ w \.] + \을 확인할 수 있으며,' ','> '또는'내 도메인 이름 정렬이 완료되면 무엇이 있는지 알기 때문에 완료됩니다. –

답변

8

당신 돈 문자열에 백 슬래시가 없습니다. 당신은 가지고 있지 않은 것을 제거 할 수 없습니다.

'\x82'으로 표시 할 사항을 고려하십시오. 1 바이트 문자열입니다.

>>> s = '\x82' 
>>> len(s) 
1 
>>> ord(s) 
130 
>>> hex(ord(s)) 
'0x82' 
>>> print s 
é # my sys.stdout.encoding is 'cp850' 
>>> print repr(s) 
'\x82' 
>>> 

'오히려'('x82')는 의미가 없습니다.

업데이트 (@>에 의해 제한) 문자열의 "비 ASCII"부분은 실제로 히라가나에 주로 쓰고 shift_jis을 사용하여 인코딩 일본어 텍스트입니다. IDLE 세션의 대본 :

>>> y = '\x82\xb1\x82\xea\x82\xa9\x82\xe7\x8c\xa9\x82\xa6\x82\xe9\x82\xbe\x82\xeb\x82\xa4' 
>>> print y.decode('shift_jis') 
これから見えるだろう 

Google 번역은 "미래를 볼 수 없습니까?"라는 영어 번역본을 제공합니다. 다른 답변에 단 댓글에서

, 당신은 말 :

난 그냥 아스키에게 내가보고있다 그것으로 뭘하는지

을 필요로하는지 멀리 떨어져 두 개의 문자열은 nltk.edit_distance()를 사용하고 있으므로 은 내게 사실의 배수를 부여합니다 거리 . 어느 것이 나를 위해 충분합니다.

왜 ASCII가 필요하다고 생각하십니까? 편집 거리는 알파벳과는 완전히 독립적으로 정의됩니다. 당신에게 진정한 거리의 일관 또는 예측 가능한 복수를 제공하지 않습니다 당신의 문자열의 무의미한 변환을하고 시작을 위해

. 둘째, 다음 중에서 :

x 
repr(x) 
repr(x).replace('\\', '') 
repr(x).replace('\\x', '') # if \ is noise, so is x 
x.decode(whatever_the_encoding_is) 

왜 세 번째를 선택합니까?

업데이트 의견에 대 한 응답에서 2 :

(1) 당신이 "아스키"을 필요가 있다고 생각하는 이유 당신은 여전히 ​​말했다하지 않았습니다. nltk.edit_distance은 "ascii"를 필요로하지 않습니다. args는 "문자열"(모든 것이 무엇이든간에)이라고하지만 코드는 !=이 작동하는 객체의 2 시퀀스와 함께 작동합니다. 즉, 위의 5 가지 옵션 중 첫 번째 옵션을 사용하지 않는 이유는 무엇입니까?

(2) 편집 거리의 최대 100 % 인플레이션을 허용하는 것은 놀랍습니다. 현재 선택한 방법은 일본어 문자 당 4 개의 기호 (16 진수)를 사용합니다. repr(x)은 문자 당 8 개의 기호를 사용합니다. x (첫 번째 옵션)은 2를 사용합니다.

(3) 편집 거리를 표준화하여 인플레이션 효과를 완화 할 수 있습니다. distance(s1, s2)을 number_of_symbols 임계 값과 비교하는 대신 distance(s1, s2)/float(max(len(s1), len(s2)))을 소수 임계 값과 비교하십시오. 음표 정규화는 일반적으로 어쨌든 사용됩니다 ... 편집 거리가 4 인 20 개 기호 문자열 간의 차이는 편집 거리가 2 인 2 개가 아닌 10 개 기호 문자열 간 차이와 거의 같습니다.

(4) nltk.edit_distance는 내가 본 것 중 가장 놀랍게도 비효율적 인 순수 Python 구현 인 edit_distance입니다. This implementation by Magnus Lie Hetland은 훨씬 뛰어 났지만 여전히 개선 할 수 있습니다.

+0

그래, 나는 그것을 텍스트 편집기에서 꺼내서 알아 낸거야. 나는 캐릭터의 repr과 프린트 표현을 얻고 있었다. 감사. –

+0

@ Joshua Olson : 내 대답의 첫 번째 판이 당신의 질문에 올바르게 답했습니다. 당신이 다른 것을하고 싶다는 사실은 당신이 나의 대답을 받아 들여야하는지와 상관이 없습니다. –

+0

문제는 인코딩 (문자열의 소스 인 스팸 메시지는 종종 잘 형성되지 않음)이 무엇인지 알지 못하기 때문에 이들 중 일부 표현이 필요합니다 (예, x도 쓰레기이므로 스트립 처리가 끝났습니다. \와 x는 모두 문자의 16 진수를 유지합니다. 네 번째 예제) edit_distance에서 비교할 수 있습니다. 만약 내가 16 진수 문자열을 가지고 있다면, 디코드 된 문자열을 사용했을 때와 마찬가지로 거리를 비교할 수 있습니다. 'repr (x) .replace ('\\ x', '')와 똑같은 문자를 기반으로 인코딩을 식별하는 방법을 알고 있다면 그것을 사용할 것입니다. –

2

이 내가 당신이 정말로 단지 "\"

>>> a = '<[email protected]\x82\xb1\x82\xea\x82\xa9\x82\xe7\x8c\xa9\x82\xa6\x82\xe9\x82\xbe\x82\xeb\x82\xa4>' 
>>> repr(a).replace("\\","")[1:-1] 
'<[email protected]x82xa6x82xe9x82xbex82xebx82xa4>' 
>>> 

을 제거하려면 생각하지만, 위의 대답처럼, 당신이 무엇을 얻을 거의 의미가 작동합니다.

+1

-1 너는 말도 안되는 일을하는 중이 야. –

+0

글쎄, 때로는 누군가가 뭔가하고 싶어하는 좋은 이유가 있습니다. 방금 경고가있는 솔루션을 제안했습니다 ... – DTing

+0

lol. 나는 이것이 들썩 들썩 한 것을 안다. – DTing

관련 문제