2008-08-18 5 views
22

TV 에피소드 (예 : show.name.s01e02.avi)의 파일 이름을 구문 분석하고 www.thetvdb.com API에서 에피소드 이름을 가져 와서 자동으로 이름을 바꾸는 스크립트가 있습니다. (쇼 이름 - [01x02] .avi)Regex 및 유니 코드

스크립트는 잘 동작합니다. 유니 코드 쇼 이름 (내가 생각한 적이없는 파일)을 사용하기 전까지는 스크립트를 사용할 수 있습니다. 영어, 그래서 대부분 꽤-많은 [a-zA-Z0-9'\-] 내의 모든 가을)

어떻게 악센트 부호가있는 문자 및 좋아하는 일치하는 정규 표현식을 허용 할 수 있습니까? 현재 정규 표현식의 구성 섹션은 다음과 같습니다.

config['valid_filename_chars'] = """[email protected]£$%^&*()_+=-[]{}"'.,<>`~? """ 
config['valid_filename_chars_regex'] = re.escape(config['valid_filename_chars']) 

config['name_parse'] = [ 
    # foo_[s01]_[e01] 
    re.compile('''^([%s]+?)[ \._\-]\[[Ss]([0-9]+?)\]_\[[Ee]([0-9]+?)\]?[^\\/]*$'''% (config['valid_filename_chars_regex'])), 
    # foo.1x09* 
    re.compile('''^([%s]+?)[ \._\-]\[?([0-9]+)x([0-9]+)[^\\/]*$''' % (config['valid_filename_chars_regex'])), 
    # foo.s01.e01, foo.s01_e01 
    re.compile('''^([%s]+?)[ \._\-][Ss]([0-9]+)[\.\- ]?[Ee]([0-9]+)[^\\/]*$''' % (config['valid_filename_chars_regex'])), 
    # foo.103* 
    re.compile('''^([%s]+)[ \._\-]([0-9]{1})([0-9]{2})[\._ -][^\\/]*$''' % (config['valid_filename_chars_regex'])), 
    # foo.0103* 
    re.compile('''^([%s]+)[ \._\-]([0-9]{2})([0-9]{2,3})[\._ -][^\\/]*$''' % (config['valid_filename_chars_regex'])), 
] 

답변

16

[\ u0000- \ uFFFF]의 하위 범위를 원하는대로 사용하십시오.

또한 re.UNICODE 컴파일 플래그를 사용할 수 있습니다. The docs 유니 코드가 설정된 경우 \ w는 유니 코드 문자 속성 데이터베이스에서 영숫자로 분류 된 문자와 [0-9_]의 문자를 더한 값과 일치합니다.

http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-05/2560.html 참조하십시오. X \

0

는 일부 언어에서 일반적인 단어 문자, 그것은 당신이 차지 얼마나 많은 바이트의 단일 문자 무시하는데 일치 할 수 있습니다으로 제공 될 것으로 보인다. 유용 할 수도 있습니다. 제프리 프리들 (좋은 책) 당신이 편지 간주됩니다 유니 코드 물건을 일치 \ P는 {문자}을 사용할 수 있다고 언급에서 정규 표현식을 마스터에서

4

.

+1

'\ P는 {문자는}'모든 정규식 엔진에서 지원되지 않으며, 파이썬의 경우, 그것은 기본're' 엔진에서 지원되지 않는. 'regex' 패키지에서만 지원됩니다. – nhahtdh

5

파이썬의 모듈은 \ p {Letter} 또는 \ X를 지원하지 않습니다. 그러나 new regex implementation on PyPI은 않습니다.

+1

그 모듈의'\ X'는 깨졌습니다; 그들은 표준을 오해하고있다. 단지'\ PM \ pM *'을 사용할 수 없거나 잘못되었을 수 있습니다. 문자열 ""\ r \ r \ n \ x {301} A \ x {301} "을 고려하십시오. [준수하는 응용 프로그램] (http://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries)은'\ X'에 대해 다음과 같은 4 개의 일치 항목을 찾습니다. 1 CP U + 000D, 2 CP U + 000D U + 000A, 1 CP U +0301 및 2 CP U + 0041 U + 0301. 깨진'\ PM \ pM *'은 또한 4 개의 일치를 찾았지만 ** 잘못된 것들 ** : 1 CP U + 000D, 1 CP U + 000D, 2 CP U + 000A U + 0301 및 2 CP U + 0041 U + 0301. 당신은 ** 반드시 CRLF를 분해하지 말고'\ P {Grapheme_Base}'코드 포인트에 마크를 두지 않아야합니다. – tchrist

+0

\ X의 정의는 다음 내용을 기반으로했습니다. http://www.regular-expressions.info/unicode.html 해결할 수 있는지 확인해 보겠습니다. – MRAB

+0

원래의 grapheme 클러스터 아이디어는 약간의 것들에 대해 다소 혼란 스러웠습니다. 그래서'\ X'를 뛰어 넘는 첫 번째 사람들은 약간 잘못 했어요. 현재 ICU와 Perl 구현은 올바른 결과를 얻었고 사실 확장 된 제자 클러스터 정의를 사용한다.'perl5.12.0 -le 'printf "% d % v04X \ n", 길이, $ _ "\ r \ r \ n \ x {301} A \ x {301} "= ~/\ X/g"이상으로 개선 된 답변을 볼 수 있습니다. – tchrist