O desafio do Machine Learning Lab da Universidade de Trieste (Itália) oferece a solução de 12 problemas e o nível de tarefas varia muito - de super fácil a difícil.
Obviamente, pode haver mais de uma solução, e os casos de teste no problema não cobrem todas as opções. No entanto, se você marcar 100%, parabéns! Teste aprovado.
Spoiler: em algumas tarefas (especialmente as leves), uma dica é praticamente uma solução.
Tarefa 1 - encontre os números
Há texto contendo números, você precisa encontrar todos os números.
Dificuldade: super fácil.
SugestãoVocê precisa usar um caractere de dígito e um quantificador multiplicador.
Solução\ d +
"[0-9] +" também é a decisão certa.
Solução de análise- "\ d" ou "[0-9]" - qualquer caractere único de 0 a 9.
- "+" - um ou mais caracteres são permitidos.
Tarefa 2 - encontre endereços mac
Há texto contendo endereços MAC, você precisa encontrá-los.
Dificuldade: fácil.
SugestãoVocê precisa usar um caractere que significa qualquer caractere de uma letra ou número, dois pontos para separar e um quantificador multiplicador.
Solução\ w {2}: \ w {2}: \ w {2}: \ w {2}: \ w {2}: \ w {2}
"+" em vez de "{2}" também é a decisão certa, embora não seja totalmente precisa.
Solução de análise- "\ w" é qualquer caractere do alfabeto ou qualquer número.
- "{2}" - apenas 2 caracteres são permitidos.
Melhor soluçãoAqueles familiarizados com o endereço mac notaram que o endereço mac está escrito em notação hexadecimal. E na solução anterior, o sinal \ w foi usado, o que significa qualquer caractere do alfabeto e todos os números. Concordo, provavelmente isso é desnecessário, mas você pode levar isso em conta, ao mesmo tempo reduzindo a regularidade.
([\ da-f] {2} :) {5} [\ da-f] {2}
Solução de análise- "\ d" é qualquer dígito único, "af" é um intervalo de a a f. No total, temos um conjunto de caracteres válido 0123456789abcdef - ou seja, o código hexadecimal Hex. "{2}" - quaisquer 2 caracteres deste conjunto de caracteres.
- "([\ da-f] {2} :)" {5} - repetir dois caracteres hex + dois pontos é permitido exatamente 5 vezes.
- e no final de "[\ da-f] {2}" - quaisquer 2 caracteres do conjunto hexadecimal
Tarefa 3 - encontre endereços ftp
Há texto com endereços FTP, você precisa encontrá-los.
Dificuldade: fácil.
SugestãoVocê precisa começar com ftp: // e listar os caracteres válidos no endereço, sem esquecer o quantificador multiplicador.
Soluçãoftp: \ / \ / [\ w \ d -_. \ /] +
Solução de análise- "\ /" - escape normal do caractere "/".
- colchetes internos é uma enumeração de caracteres válidos, ou seja, qualquer caractere no alfabeto ou qualquer número, hífen, sublinhado, ponto ou barra (se houver outros caracteres no nome, você poderá adicioná-los).
Tarefa 4 - encontre um modelo
Há algum tipo de arquivo formatado no qual você precisa encontrar todas as linhas correspondentes ao padrão $ any characters $.
Dificuldade: fácil.
SugestãoVocê precisa usar o escape do caractere reservado, o caractere de qualquer caractere, quantificadores de multiplicidade e preguiçoso.
SoluçãoUma tarefa comum, mas requer um conhecimento um pouco melhor dos regulares.
\\ $. +? \\ $
Solução de análise- "\\ $" é a triagem do dólar.
- ". +" - qualquer número de caracteres, "?" - remover a ganância.
Tarefa 5 - encontre endereços IP
Encontre endereços IP a partir do texto.
Dificuldade: fácil.
SugestãoMuito parecido com a segunda tarefa.
Solução\ d + \. \ d + \. \ d + \. \ d +
Se em vez de "+" você escreveu "{1,3}", está pronto.
Solução de análise- "\ d" é qualquer dígito único,
- "+" - qualquer número de caracteres, "{1,3}" - uma restrição estrita ao número de caracteres (de 1 a 3).
Melhor soluçãoUm endereço IP não é apenas números, mas números de 0 a 255.
\ b ((\ d | [1-9] \ d | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5]) \.) {3} (\ d | [1 -9] \ d | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5]) \ b
Solução de análisePara determinar o intervalo de 0 a 255, você precisará tentar um pouco:
- "\ d" é um número de 0 a 9
- "[1-9] \ d" - um número de 10 a 99
- "1 \ d {2}" - um número de 100 a 199
- "2 [0-4] \ d" - um número de 200 a 249
- "25 [0-5]" - de 250 a 255
A seguir, permitimos a repetição do padrão de dígitos de 0 a 255 exatamente 3 vezes:
- "(\ d | [1-9] \ d | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5]).) {3}" - dentro do ponto, porque também repetido 3 vezes e no final o mesmo intervalo de números, mas sem um ponto.
- no final e no início, adicionamos o símbolo de borda da palavra "\ b" - é necessário para remover o texto "1172.30.42.109" da entrada (concordo que é improvável e provavelmente desnecessário).
Tarefa 6 - Âncora
Puxe a tag href do documento html.
Dificuldade: média.
SugestãoUse "qualquer caractere, exceto" e "ou" para cada parêntese.
Soluçãohref = ("[^"] + "| '[^'] + ')
Solução de análise- "- inicie a pesquisa com aspas duplas.
- "[^"] + "- ainda mais qualquer caractere, exceto aspas duplas.
- Terminamos com aspas duplas.
Colocamos tudo isso entre parênteses, acrescentamos o sinal ou - "|" e repita o mesmo para aspas simples.
Tarefa 7 - Links
Em qualquer texto, encontre todos os links. A tarefa é complicada pelo fato de não ser suficiente apenas encontrar o link; você precisa descartar caracteres inválidos no final.
Dificuldade: difícil.
SugestãoVocê precisa começar com http, usar "qualquer caractere, exceto" e finalizar a pesquisa com um caractere válido.
Soluçãohttp: \ / \ / ([^> \ s] +) [\ w \ /]
Não há links https na tarefa, mas você pode levar isso em consideração adicionando "s?" depois de http.
Solução de análise- "[^> \ s] +" procura quaisquer caracteres, exceto o caractere ">" e o caractere de espaço. De fato, você pode ler assim "vamos até vermos um desses símbolos".
- "[\ w \ /]" é um delimitador que permite que um link termine apenas com um caractere latino ou uma barra.
E no final - começamos com http: //, então absolutamente qualquer caractere, exceto os caracteres "<" ou espaço, mas no final o caractere ou barra latino é necessário.
- "s extras"? em "https?" apenas permita "http: //" e "https: //".
Tarefa 8 - Cabeçalhos
Em HTML, um cabeçalho é qualquer tag h + digit.
Dificuldade: média.
SugestãoComece com h + dígito + qualquer caractere ou sua ausência.
SoluçãoBem simples:
<h \ d. *>. * <\ / h \ d. *>
Solução de análise- "h \ d" - aqui dizemos que após o caractere deve necessariamente ir "\ d" dígito.
- E então ". *" Pode ir com qualquer número de caracteres ou nada pode ir.
Melhor soluçãoDepois que h chega um dígito, e na especificação html, é indicado que os números de 1 a 6 são válidos e a própria tag não pode ser fechada por nada além de colchetes triangulares. Portanto, esta solução será mais precisa:
<h [1-6] [^>] *>. +? <\ / h [1-6]>
É verdade que existe um erro que permite abrir a etiqueta com um dígito e fechar o outro. E, portanto, uma solução ainda mais precisa seria usar os links: "<h ([1-6]) [^>] *>. +? <\ / H \ 1>". Isso não quer dizer que o teste não diferencia maiúsculas de minúsculas.
Solução de análise- "h [1-6]" - aqui dizemos que depois de "h" o número deve ir de 1 a 6.
- "[^>] *" - qualquer caractere, exceto ">", pode continuar ou não.
Separadamente, sobre a adição:
- Embrulhando a expressão "(h [1-6])" entre colchetes, criamos um grupo no número 1.
- Além disso, usando o link para o primeiro grupo "\ 1", falamos sobre o que queremos ver no final do mesmo, h com o mesmo número do início.
Tarefa 9 - Telefones
Em texto livre encontrado em todos os telefones em diferentes formatos.
Dificuldade: difícil.
SugestãoÉ necessário usar o sinal da presença de um símbolo ou sua ausência, um quantificador para limitar o número de dígitos e a construção de um conjunto de caracteres. Projeto possível ou.
Solução\ (? \ d {3} [\). \ / -] {1,2} \ d {3} [-.] \ D {4}
Funcionará, mas permitirá dois caracteres após os três primeiros dígitos - é bom se for um colchete de fechamento e um espaço depois dele, mas é ruim se houver dois hífens. Portanto, existe uma solução um pouco mais precisa: "\ (? \ D {3} (\)? | [. \ / -]) \ d {3} [-.] \ D {4}"
Solução de análise- "\ (?" - indicamos a possibilidade da presença do símbolo "(" ou a sua ausência, protegemos porque é um símbolo reservado.
- "\ d {3}" - dígitos com uma restrição de apenas 3.
- Caracteres adicionais "[\). \ / -] {1,2}" são possíveis - barra, parêntese de fechamento, ponto, espaço, barra invertida e hífen. {1,2} - diz que esses caracteres podem ser 1 ou 2. Por exemplo, o colchete de fechamento e o espaço após ele.
- Além disso, necessariamente "[-.]" - um hífen ou ponto final.
- E "\ d {4}" são os quatro dígitos no final.
Tarefa 10 - Autores
Há um certo padrão que contém elementos, encontre todos os autores no campo do autor.
Dificuldade: muito difícil.
SugestãoÉ necessário confiar no fato de que todos os nomes de autores começam com uma letra maiúscula e são escritos em um padrão.
Solução[AZ] [A-Za-z - '] +, [AZ] (\ {\\ "\ w \})? [A-za-z -'] * ([AZ] [A-Za-z- '] *)?
Esta solução está correta, mas tem um sinal de menos. Andamos "{\" u} com uma "muleta" ({\ "\ w})?" e, basicamente, é viável se você também colocar essa muleta em outras partes dos nomes dos autores.
De qualquer forma, se você conseguiu resolver esse problema de alguma forma, isso é muito legal!
Solução de análise- "[AZ] [A-Za-z - '] +" - Estamos procurando uma palavra que necessariamente comece com uma letra maiúscula e, em seguida, contenha qualquer caractere do alfabeto, hífen ou apóstrofo.
- Além disso, tudo é exatamente o mesmo que um pouco mais alto, mas aqui entre nós temos "({\" \ w})? "- é apenas uma muleta que permite ignorar a blindagem. Isso significa que um pedaço de" {\ "u}" pode estar presente ou estar ausente.
- E, novamente, exatamente a mesma coisa que no primeiro caso "([AZ] [A-Za-z - '] *)?", O aviso é com a exceção de que essa expressão está agrupada em um grupo e existe um "?" significando não vincular essa condição.
A enumeração PS [A-Za-z] aqui é uma medida necessária, porque não há modificadores no teste.
Melhor soluçãoExiste uma solução mais compacta e simples que permite abandonar a muleta acima:
[AZ] \ S +, [AZ] \ S * ([AZ] [\ S] *)? \ B
Solução de análise- "[AZ] \ S +," - primeiro, necessariamente, a letra maiúscula "[AZ]" e, em seguida, qualquer número de caracteres que não sejam espaços em branco "\ S +" para o ponto e vírgula ",".
- Além disso, quase o mesmo "[AZ] \ S *" - o início é necessariamente com uma letra maiúscula e, em seguida, qualquer caractere que não seja um espaço em branco na borda da palavra "\ b".
- "([AZ] [\ S] *)?" - e entre eles o mesmo grupo, mas não obrigatório, para um nome do meio.
Tarefa 11 - Conteúdo do cabeçalho
Assim como na tarefa 8, mas você precisa encontrar não os cabeçalhos, mas o conteúdo deles.
Dificuldade: difícil.
SugestãoA tarefa é idêntica à tarefa 8. Não é difícil se você souber olhar para frente e para trás. Tem uma solução com olhar para trás e sem olhar para trás.
SoluçãoSem olhar para trás:
([\ w] * <[^ h]. + | [^ <>] +) (? = <\ / h \ d>)
Solução de análise- "([\ w] * <[^ h]. + | [^ <>] +)" - há duas opções para como o conteúdo do cabeçalho pode começar. O primeiro é com a tag dentro de "[\ w] * <[^ h]. +" - ao mesmo tempo, você precisa ter certeza de que não é a tag h e levar em consideração que pode haver texto antes da tag. A segunda opção é o texto sem as tags "[^ <>] +", ou seja, quaisquer caracteres que não sejam a abertura e o fechamento da tag.
- "(? = <\ / h \ d>)" - olhando para o futuro, dentro do qual deve haver uma marca de fechamento h.
Olhando para trás:
(? <= <h [^>] +>). +? (? = <\ / h \ d>)
Além disso, você pode levar em consideração todos os comentários sobre a solução 8 do problema.
Solução de análise- "(? <= <h [^>] +>)" - espiando de volta para dentro da qual deve haver uma tag h.
- "(? = <\ / h \ d>)" - olhando para o futuro, dentro do qual deve haver uma marca de fechamento h.
Tarefa 12 - Lista de autores
A tarefa é semelhante à 10ª, mas na minha opinião é mais fácil.
Dificuldade: difícil.
SugestãoTodos os princípios básicos das 10 tarefas, mas você precisa considerar o início da linha. A solução que eu conheço usa espreitar de volta.
Solução(? <= ^ \ d + \.) [AZ] [\ w] +, [AZ] [\ w \.] +
Solução de análise- "(? <= ^ \ d +.)" - olhando para trás, onde você deve ter qualquer número de dígitos até o ponto com um espaço de uma nova linha.
- "[AZ] [\ w] +," - acrescente qualquer palavra de uma letra maiúscula a um ponto e vírgula e mais uma vez o mesmo "[AZ] [\ w.] +".
Ou simplesmente:
(? <= ^ \ d + \.) [^,] +, [^,:] +
Solução de análise- "(? <= ^ \ d +.)" - olhando para trás, onde você deve ter qualquer número de dígitos até o ponto com um espaço de uma nova linha.
- "[^,] +," - qualquer número de caracteres para a vírgula + vírgula.
- "[^,:] +" - qualquer número de caracteres antes da vírgula ou dois pontos.