Alguns problemas de correspondência de padrões com correspondência de padrões em Lua

StackOverflow https://stackoverflow.com/questions/2569496

  •  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>&nbsp;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="&deg;F" metric="&deg;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.

Foi útil?

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.

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