Expressões regulares

Para além das expressões regulares que eu usava com o FLEX, e também depois, com o PERL e o PHP, o Python tem umas expressões novas, que me parecem ter sido criadas pelo próprio Python, e que são bastante interessantes.

*?, +?, ??
Cria uma versão não gananciosa dos quantificadores *, +, ?. Neste caso, vai ser encontrada a expressão mínima, ao invés da expresão máxima.

{m,n}?
Da mesma forma que no caso anterior, aqui vai ser encontrada a expressão mínima de {m,n}. Por exemplo, para a string de 6 carateres 'aaaaaa', a{3,5} emparelha 5 carateres 'a', enquanto que a{3,5}? emparelha apenas 3 carateres.

(?...)
É uma notação de extensão. O caráter após o ? define o resto da sintaxe. Ver abaixo.

(?iLmsux)
As letras 'i', 'L', 'm', 's', 'u', 'x' correpondem às flags re.I (ignore case), re.L (locale dependent), re.M (multi-line), re.S (dot matches all), re.U (Unicode dependent), and re.X (verbose), para toda a expressão regular. Alternativamente, também se pode passar a flag na função re.compile().

(?:...)

Captura uma expressão, mas ignora-a no grupo de expressões capturadas
(?P<name>...)

Atribui um nome ao objeto capturado. Substitui o nome group. Na mesma expressão, o nome name é único. Por exemplo, (?P<quote>['"]).*?(?P=quote) captura qualquer string delimitada por aspas ou plicas.

(?P=name)
Equivalente ao anterior.

(?#...)
Comentário. Ignorado.

(?#...)
Emparelha, se ... emparelhar o próximo, mas não consome a string. É chamada uma lookahead assertion. Por exemplo, Isaac (?=Asimov) emparelha 'Isaac ' apenas se seguido de 'Asimov'.

(?!...)
Emparelha se não emparelhar o próximo. É uma negative lookahead assertion. Por exemplo, Isaac (?!Asimov) emparelha 'Isaac ' apenas se não for seguido de 'Asimov'.

(?<=...)
Emparelha se a posição atual na string for precedida por um emparelhamento de ... que termine na posição atual. É denominada uma positive lookbehind assertion. (?<=abc)def emparelha com abcdef, uma vez que o lookbehind volta atrás 3 carateres e verifica se o padrão mencionado emparelha.

>>> import re
>>> m = re.search('(?<=abc)def', 'abcdef') >>> m.group(0)
'def'

Outro exemplo, que procura uma palavra que segue um hífen.

>>> m = re.search('(?<=-)\w+', 'spam-egg') >>> m.group(0)
'egg'

(?<!...)

Emparelha, se a posição atual na string não for precedida por um .... É chamado um negative lookbehind assertion. É o oposto do anterior.

(?(id/name)yes-pattern|no-pattern)

Tenta emparelhar com yes-pattern se o grupo com o id ou o name existir, e com no-pattern se não existir. no-pattern é opcional e pode ser omitido. Por exemplo, (<)?(\w+@\w+(?:\.\w+)+)(?(1)>) é um padrão fraco para emparelhar emails, que emparelha '<user@host.com>' assim como 'user@host.com', masn não '<user@host.com'.

 

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *