Regex e Unicode

votos
22

Eu tenho um script que analisa os nomes de episódios de TV (show.name.s01e02.avi por exemplo), pega o nome episódio (a partir da API www.thetvdb.com) e automaticamente renomeia-los em algo mais agradável (Mostrar nome - [01x02 ] avi)

O script funciona bem, isto é, até você tentar usá-lo em arquivos que possuem show-nomes Unicode (algo que eu realmente nunca pensei sobre, uma vez que todos os arquivos que eu tenho são Inglês, por isso, na sua maioria muito-muito todos caem dentro [a-zA-Z0-9'\-])

Como posso permitir que as expressões regulares para corresponder caracteres acentuados e os gostos? Atualmente seção de configuração do regex parece ..

config['valid_filename_chars'] = 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@£$%^&*()_+=-[]{}'.,<>`~? 
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'])),
]
Publicado 18/08/2008 em 10:41
fonte usuário
Em outras línguas...                            


4 respostas

votos
16

Use uma subfaixa de [\ u0000- \ uFFFF] para o que você quer.

Você também pode usar a bandeira re.UNICODE compilação. Os médicos dizem que se Unicode for definida, \ w irá coincidir com os caracteres [0-9_] mais tudo o que é classificado como alfanumérico no Unicode banco de dados de propriedades de caracteres.

Veja também http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-05/2560.html .

Respondeu 18/08/2008 em 10:43
fonte usuário

votos
5

Módulo re do Python não suporta \ p {Carta} ou \ X. No entanto, a nova implementação regex em PyPI faz.

Respondeu 02/04/2011 em 00:19
fonte usuário

votos
4

Em Dominando Expressões Regulares de Jeffrey Friedl (grande livro) é mencionado que você poderia usar \ p {Carta} que irá coincidir com o material unicode que é considerado uma carta.

Respondeu 18/08/2008 em 11:17
fonte usuário

votos
0

\ X parece estar disponível como um genérico palavra caracteres em alguns idiomas, ele permite que você para combinar com um único desconsideração caráter de quantos bytes ele ocupa. Pode ser útil.

Respondeu 18/08/2008 em 10:53
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more