Alguns problemas de correspondência de padrões com correspondência de padrões em Lua
-
24-09-2019 - |
Pergunta
Tenho trabalhado em uma previsão do tempo para um programa que uso e, na maior parte, está funcionando bem.Aqui está o que tenho até agora.(Não preste atenção ao zs.stuff.Isso é específico do programa e não tem relação com a codificação Lua.)
if not http then http = require("socket.http") end
local locale = string.gsub(zs.params(1),"%s+","%%20")
local page = http.request("http://www.wunderground.com/cgi-bin/findweather/getForecast?query=" .. locale .. "&wuSelect=WEATHER")
local location = string.match(page,'title="([%w%s,]+) RSS"')
--print("Gathering weather information for " .. location .. ".")
--local windspeed = string.match(page,'<span class="nobr"><span class="b">([%d.]+)</span> mph</span>')
--print(windspeed)
local condition = string.match(page, '<td class="vaM taC"><img src="http://icons-ecast.wxug.com/i/c/a/[%w_]+.gif" width="42" height="42" alt="[%w%s]+" class="condIcon" />')
--local image = string.match(page, '<img src="http://icons-ecast.wxug.com/i/c/a/(.+).gif" width="42" height="42" alt="[%w%s]+" class="condIcon" />')
local temperature = string.match(page,'pwsvariable="tempf" english="°F" metric="°C" value="([%d.]+)">')
local humidity = string.match(page,'pwsvariable="humidity" english="" metric="" value="(%d+)"')
zs.say(location)
--zs.say("image ./Images/" .. image .. ".gif")
zs.say("<color limegreen>Condition:</color> <color white>" .. condition .. "</color>")
zs.say("<color limegreen>Temperature: </color><color white>" .. temperature .. "F</color>")
zs.say("<color limegreen>Humidity: </color><color white>" .. humidity .. "%</color>")
Meu principal problema é este:Alterei a 'condição' e adicionei as variáveis 'imagem' ao que são agora.Mesmo que a linha que deveria corresponder venha diretamente da página da web, ela não corresponde de forma alguma.Então, estou me perguntando o que está faltando e que está impedindo esse código de funcionar.Se eu tirar o
<td class="vaM taC">
<img src="http://icons-ecast.wxug.com/i/c/a/[%w_]+.gif"
corresponderá perfeitamente à condição.(Por alguma razão, não consigo exibir a linha acima corretamente, mas não há espaço entre `< e img)
Alguém pode apontar o que há de errado com isso?Além da correspondência de padrões, garanto que a linha é literal da página da web.
Outra dúvida que tive é a capacidade de combinar quebras de linha.Existe alguma maneira possível de fazer isso?A razão pela qual pergunto é porque, na mesma página, algumas das coisas que preciso corresponder estão divididas em linhas separadas e, como o padrão real que desejo corresponder aparece em outros lugares da página, preciso para poder combinar quebras de linha para obter o padrão exato.
Solução
Você pode simplificar consideravelmente sua partida (veja abaixo), mas em geral parece que você tem dois problemas...
- Faltando o () ao redor da partida que você deseja capturar.
- Você precisa escapar do .caracteres em sua partida, tornando-os%.
Eu tentei isso e funcionou...
local page = [[<td class="vaM taC"><img src="http://icons-ecast.wxug.com/i/c/a/hello_world.gif" width="42" height="42" alt="HELLO WOLRD" class="condIcon" />]]
local condition, image = string.match(page, '.+/([%w_]+)%.gif".+alt="([%w%s]+)".+')
print(condition, image)
isso impresso...
hello_world HELLO WORLD
quanto a multilinhas, isso não deve ser um problema, as novas linhas são apenas caracteres de controle e se você ler várias linhas na mesma string, essa correspondência funciona.