2010-01-17 2 views
3

편집 :이 질문은 실제로 "r"플래그가 의미하는 것을 선택하면 이해가되지 않습니다. 자세한 내용은 here입니다. 빠른 anwser를 찾는 사람들을 위해 아래에 추가했습니다. 내가 파이썬 스크립트에서 수동으로 정규 표현식을 입력하면파이썬 원시 문자열과 유니 코드 : 웹 입력을 정규식 패턴으로 사용하는 방법?

, 내 패턴 문자열 플래그 4 개 조합을 사용할 수 있습니다

  • P1 = "패턴"
  • P2 = U "패턴"
  • P3 = R "패턴"
  • P4 = RU "패턴"

내가 무리가 웹 양식 입력에서 오는 유니 코드 문자열과 regexp 패턴으로 사용하고 싶습니다.

문자열에 적용해야하는 프로세스를 알고 싶습니다. 위의 수동 양식 사용과 비슷한 결과가 예상됩니다. 다음과 같이 입력하십시오 :

import re 
assert re.match(p1, some_text) == re.match(someProcess1(web_input), some_text) 
assert re.match(p2, some_text) == re.match(someProcess2(web_input), some_text) 
assert re.match(p3, some_text) == re.match(someProcess3(web_input), some_text) 
assert re.match(p4, some_text) == re.match(someProcess4(web_input), some_text) 

someProcessN에 대한 someProcessN은 무엇이고 그 이유는 무엇입니까?

someProcess2는 로컬 인코딩으로 유니 코드 변환을 수행해야하지만 someProcess2는 아무 것도 할 필요가 없다고 가정합니다. 원시 문자열 리터럴의 경우 나는 우둔합니다.

+0

're.match'는 regexp match 객체를 생성하고 동일한 데이터를 포함하고 있다면'=='와 비교할 수 없다는 것을 알아 두십시오 ('=='신원 확인. 이는 참조가 동일해야 함을 의미합니다). – poke

+0

맞습니다. 예상되는 결과를 얻으려면 .group()과 .groups()를 섞어서 사용해야합니다. –

답변

5

"파이썬 2. *에서 유니 코드를 올바르게 인코딩해야하는 것 외에도"원시 문자열 "에 대해 유형이 없으므로 처리가 필요하지 않습니다. 문자열 상수에 대한 구문 일뿐입니다 , 코드 스 니펫에 문자열 상수가 없으므로 "처리"할 수 없습니다.

+0

그래, 먼저 다른 질문을해야 했어. 지금 나는 그것을 얻었다, 나는 이것이 의미가 없다는 것을 이해한다. –

1

"r"플래그는 파이썬이 문자열에서 "\"를 해석하지 못하게합니다. 웹은 그것이 운반하는 데이터의 종류에 상관하지 않기 때문에 웹 입력은 원하는 방식으로 자유롭게 해석 할 수있는 일련의 바이트가됩니다.

그래서이 문제를 해결하기 :

  • 유니 코드를 사용하십시오 (예 : UTF-8) 당신이 문자열을 얻을 때, 그것은 유니 코드와 "\ n을"입니다
  • 모든 긴 길, "\ t"와 "\ a"는 리터럴이되므로, 탈출 할 필요가 없다면 신경 쓰지 않아도됩니다. 당신의 첫 번째 예제에서 다음
+0

»문자열에서 "/"를 해석하지 못했습니다.«- "\"입니다. – poke

+0

하느님, 당신은 이것을 어떻게 빨리 읽을 수 있습니까? 그리고 실수로 실수를 찾으십시오. –

1

참고 : 이러한 구조는 다를 수 있지만, 그들은 모두 같은 일을

>>> p1 = "pattern" 
>>> p2 = u"pattern" 
>>> p3 = r"pattern" 
>>> p4 = ur"pattern" # it's ur"", not ru"" btw 
>>> p1 == p2 == p3 == p4 
True 

, 그들은 문자열 객체 (P1을 작성하고 str과 P2와 P4를 P3 Python 2.x의 unicode 개체)이며 값이 "pattern"입니다. u, rur은 파서에 다음 인용 문자열을 해석하는 방법, 즉 다른 문자를 인코딩하는 백 슬래시가 무시되는 유니 코드 텍스트 (u) 및/또는 원시 텍스트 (r)로 해석하는 방법을 알려줍니다. 그러나 결국 문자열이 어떻게 생성되었는지는 중요하지 않으며, 원시 문자열이거나 내부적으로 동일하게 저장됩니다.

유니 코드 텍스트를 입력 할 때 unicode 텍스트 또는 str 오브젝트 인 경우 (파이썬 2.x에서) 서로 다르게해야합니다. 유니 코드 콘텐츠로 작업하려면 내부적으로 그 개체로만 작업하고 모든 str 개체를 unicode 개체 (str.decode() 또는 하드 코드 된 텍스트의 경우 u'text') 개체로 변환해야합니다. 그러나 로컬 인코딩으로 인코딩하면 유니 코드 기호에 문제가 발생합니다.

다른 접근법은 파이썬 3을 사용하는 것인데, str 객체는 유니 코드를 직접 지원하고 모든 것을 유니 코드로 저장하며 인코딩에 신경 쓰지 않아도됩니다.

관련 문제