Pergunta

Perl e alguns outros motores de regex atuais suportam propriedades Unicode, tais como a categoria, em um regex. Por exemplo. em Perl você pode usar \p{Ll} para coincidir com uma letra minúscula arbitrária, ou p{Zs} para qualquer separador de espaço. Não vejo suporte para este tanto no 2.x nem 3.x linhas de Python (com as devidas arrependimentos). Alguém está ciente de uma boa estratégia para obter um efeito semelhante? soluções caseiras são bem-vindos.

Foi útil?

Solução

Você já tentou Ponyguruma , um Python ligação ao Oniguruma mecanismo de expressão regular? Nesse motor você pode simplesmente dizer \p{Armenian} para combinar personagens armênios. \p{Ll} ou \p{Zs} trabalho também.

Outras dicas

O regex módulo (uma alternativa ao módulo de re padrão) suporta propriedades codepoint Unicode com a sintaxe \p{}.

Você pode usar meticulosamente unicodedata em cada personagem:

import unicodedata

def strip_accents(x):
    return u''.join(c for c in unicodedata.normalize('NFD', x) if unicodedata.category(c) != 'Mn')

Falando de soluções caseiras, algum tempo atrás eu escrevi um pequeno programa para fazer exatamente isso - converter uma categoria unicode escrito como \p{...} em um intervalo de valores, extraído do unicode especificação (v.5.0.0). Somente categorias são suportadas (ex .: L, Zs), e se restringe ao BMP. Estou postando aqui no caso de alguém achar que é útil (embora isso Oniguruma realmente parece uma opção melhor).

Exemplo de utilização:

>>> from unicode_hack import regex
>>> pattern = regex(r'^\\p{Lu}(\\p{L}|\\p{N}|_)*')
>>> print pattern.match(u'疂_1+2').group(0)
疂_1
>>>

Aqui está o fonte . Há também um JavaScript versão , usando os mesmos dados.

Você está certo de que Unicode classes de propriedade não são suportados pelo analisador regex Python.

Se você queria fazer um corte agradável, que seria geralmente útil, você pode criar um pré-processador que analisa uma seqüência de tais fichas de classe (\p{M} ou qualquer outro) e substitui-los com os conjuntos de caracteres correspondentes, de modo que, por exemplo , \p{M} se tornaria [\u0300–\u036F\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F] e \P{M} se tornaria [^\u0300–\u036F\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F].

As pessoas obrigado. :)

Note que, enquanto \p{Ll} não tem equivalente no Python expressões regulares, \p{Zs} devem ser abrangidos pela '(?u)\s'. O (?u), como os documentos dizem, “Marca \ w, \ W, \ b, \ B, \ d, \ D, \ s e \ S dependente da base de dados Unicode propriedades de caracteres”. e \s significa qualquer caractere de espaçamento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top