Найдите слово в третьем разделе файла - PullRequest
1 голос
/ 04 августа 2020

Через пару лет go, я задал вопрос о поиске определенного слова в одном разделе файла здесь: RegEx - найти слово внутри определенного c раздела файла

Теперь я хотел бы go на шаг дальше, чем это сделал этот вопрос, и я спотыкаюсь, пытаясь заставить RegEx выдать совпадение для меня. Я пытаюсь посмотреть на прогноз зоны округа Вашингтон и посмотреть, встречается ли слово серьезный в третьем прогнозном периоде. Я использую это в сообщении о погоде, и все, что мне нужно сделать, это предоставить выражение RegEx ... затем программное обеспечение будет оценивать входящий бюллетень погоды по этому выражению RegEx и, если есть совпадение, обрабатывать бюллетень (если есть нет совпадений, бюллетень отбрасывается и продолжается).

Итак, у меня есть следующий бюллетень (немного урезанный по сравнению с оригиналом):

FPUS55 KBOU 031108
ZFPBOU

Zone Forecast Product for Northeast Colorado
National Weather Service Denver/Boulder CO
508 AM MDT Mon Aug 3 2020

COZ048-040300-
Logan County-
including Crook, Merino, Sterling, and Peetz
508 AM MDT Mon Aug 3 2020

.TODAY...Mostly sunny. Isolated thunderstorms late in the
afternoon. Highs in the lower to mid 80s. Southeast winds 10 to
20 mph. Chance of thunderstorms 10 percent.
.TONIGHT...Partly cloudy in the evening then becoming mostly
cloudy. Isolated thunderstorms. Lows in the upper 50s. South
winds 10 to 20 mph. Chance of thunderstorms 20 percent.
.TUESDAY...Partly cloudy in the morning, then mostly cloudy with
a 40 percent chance of thunderstorms in the afternoon. Some
thunderstorms may be severe. Highs in the mid 80s to lower 90s.
Southeast winds 10 to 15 mph.
.TUESDAY NIGHT...Partly cloudy with a 40 percent chance of
thunderstorms. Some thunderstorms may be severe. Lows in the mid
50s.
.WEDNESDAY...Mostly sunny with a 30 percent chance of
thunderstorms. Highs in the mid 80s to lower 90s.
.WEDNESDAY NIGHT...Partly cloudy with a 30 percent chance of
thunderstorms. Lows in the upper 50s.
.THURSDAY...Mostly sunny with a 30 percent chance of
thunderstorms. Highs near 90.
.THURSDAY NIGHT...Partly cloudy with a 20 percent chance of
thunderstorms. Lows in the upper 50s.
.FRIDAY...Mostly sunny with a 10 percent chance of thunderstorms.
Highs in the lower to mid 90s.
.FRIDAY NIGHT...Partly cloudy with a 10 percent chance of
thunderstorms. Lows around 60.
.SATURDAY...Mostly sunny with a 10 percent chance of
thunderstorms. Highs in the lower 90s.
.SATURDAY NIGHT...Partly cloudy with a 10 percent chance of
thunderstorms. Lows around 60.
.SUNDAY...Mostly sunny with a 10 percent chance of thunderstorms.
Highs in the lower to mid 90s.

$$

COZ049-040300-
Washington County-
including Akron, Cope, Last Chance, and Otis
508 AM MDT Mon Aug 3 2020

.TODAY...Mostly sunny. Slight chance of thunderstorms early in
the morning. Isolated thunderstorms late in the afternoon. Highs
82 to 88. Southeast winds 10 to 20 mph. Chance of thunderstorms
20 percent.
.TONIGHT...Partly cloudy. Isolated thunderstorms in the evening.
Lows in the upper 50s. Southeast winds 10 to 20 mph. Chance of
thunderstorms 20 percent.
.TUESDAY...Partly cloudy. A 40 percent chance of thunderstorms in
the afternoon. Some thunderstorms may be severe. Highs near 90.
Southeast winds 10 to 15 mph with gusts to around 25 mph.
.TUESDAY NIGHT...Partly cloudy with a 50 percent chance of
thunderstorms. Some thunderstorms may be severe. Lows in the mid
50s.
.WEDNESDAY...Mostly sunny with a 30 percent chance of
thunderstorms. Highs near 90.
.WEDNESDAY NIGHT AND THURSDAY...Partly cloudy with a 30 percent
chance of thunderstorms. Lows in the upper 50s. Highs near 90.
.THURSDAY NIGHT...Partly cloudy with a 20 percent chance of
thunderstorms. Lows around 60.
.FRIDAY...Mostly sunny with a 10 percent chance of thunderstorms.
Highs in the lower to mid 90s.
.FRIDAY NIGHT...Partly cloudy with a 10 percent chance of
thunderstorms. Lows around 60.
.SATURDAY...Mostly sunny with a 10 percent chance of
thunderstorms. Highs in the mid 90s.
.SATURDAY NIGHT...Partly cloudy with a 10 percent chance of
thunderstorms. Lows around 60.
.SUNDAY...Mostly sunny. Highs in the lower to mid 90s.

$$

COZ046-040300-
North and Northeast Elbert County Below 6000 Feet/North Lincoln
County-
including Agate, Hugo, Limon, and Matheson
508 AM MDT Mon Aug 3 2020

.TODAY...Mostly sunny. Scattered thunderstorms late in the
afternoon. Highs in the lower to mid 80s. South winds 10 to
15 mph. Chance of thunderstorms 30 percent.
.TONIGHT...Mostly cloudy with scattered thunderstorms in the
evening, then partly cloudy after midnight. Lows in the 50s.
Southeast winds 10 to 15 mph. Chance of thunderstorms 30 percent.
.TUESDAY...Partly cloudy. A 40 percent chance of thunderstorms in
the afternoon. Some thunderstorms may be severe. Highs near 90.
Southeast winds 10 to 15 mph with gusts to around 25 mph.
.TUESDAY NIGHT...Partly cloudy with a 40 percent chance of
thunderstorms. Some thunderstorms may be severe. Lows in the 50s.
.WEDNESDAY...Mostly sunny with a 30 percent chance of
thunderstorms. Highs in the upper 80s. Southeast winds 10 to
15 mph.
.WEDNESDAY NIGHT AND THURSDAY...Partly cloudy with a 30 percent
chance of thunderstorms. Lows in the mid to upper 50s. Highs in
the upper 80s.
.THURSDAY NIGHT...Partly cloudy with a 20 percent chance of
thunderstorms. Lows in the mid 50s to lower 60s.
.FRIDAY...Mostly sunny with a 10 percent chance of thunderstorms.
Highs in the lower 90s.
.FRIDAY NIGHT...Partly cloudy with a 10 percent chance of
thunderstorms. Lows in the upper 50s.
.SATURDAY...Mostly sunny with a 10 percent chance of
thunderstorms. Highs in the lower 90s.
.SATURDAY NIGHT...Partly cloudy with a 10 percent chance of
thunderstorms. Lows in the upper 50s.
.SUNDAY...Mostly sunny. Highs in the lower 90s.

$$

Округ Вашингтон сам по себе зона в данном конкретном примере, и это вторая зона в этом бюллетене. У меня есть существующее правило в Сообщении о погоде, которое ищет в любом периоде прогноза, помеченном "REST OF TODAY", слово "серьезный":

Washington County((?!\n\$\$)[\s\S])+\n\.REST OF TODAY((?!\n\.)[\s\S])+severe

Обратите внимание, что это выражение не вернет совпадение с бюллетенем выше. . У меня есть похожие правила, которые просматривают периоды прогноза, помеченные «СЕГОДНЯ» и «СЕГОДНЯ», в том же формате. Это сработало для меня очень хорошо, но я хотел бы начать смотреть вперед на прогноз на следующий день (который будет либо третьим, либо четвертым периодом прогноза). К сожалению, все они помечены днем ​​недели или, если завтра выходной день, названием праздника. Чтобы избежать создания пятнадцати или двадцати правил для записи каждого дня или праздника, я хотел бы разработать выражение RegEx, которое будет отображаться только в (для этого примера) третьем периоде прогноза.

В центре раздел этого RegEx оказался для меня трудным. Я пробовал что-то вроде

Washington County((?!\n\$\$)[\s\S])+(\n\.){3}((?!\n\.)[\s\S])+severe

и

Washington County((?!\n\$\$)[\s\S])+(\.\.\.){3}((?!\n\.)[\s\S])+severe

, чтобы убрать либо новую строку, за которой следует период, который сигнализирует о начале каждого периода прогноза, либо многоточие, разделяющее каждый период прогноза из своего прогноза, но ни один из них не дает совпадений.

RegEx удивительно гибок, поэтому я полагаю, что должен быть способ достичь sh этого, но я до сих пор не мог понять это. Мы будем очень признательны за любую помощь, которую может предоставить сообщество.

1 Ответ

0 голосов
/ 04 августа 2020

Если вы хотите получить третий период прогноза, который, как я предполагаю, будет TUESDAY, вы можете сначала сопоставить от Washington County до первого наступления периода прогноза, который соответствует шаблону вроде \.[A-Z]+(?: [A-Z]+)?\.{3}

Затем вы можете сопоставить все строки, которые не начинаются ни с шаблона прогноза, ни с $$, используя отрицательный прогноз (?!, и повторите это 2 раза, используя {2}, чтобы перейти к третьей части.

Затем, в третьей части, где вы хотите найти серьезную проблему, она может быть либо в той же первой строке, которая запускает модель прогноза, либо в любых последующих строках. Вы можете при желании сопоставить их, а затем сопоставить строгое в строке, которая его содержит.

Это немного многословно, потому что для предотвращения слишком большого сопоставления, как сопоставления слова в следующем периоде прогноза или в следующем разделе, вы должны проверить, не содержат ли строки значений, которые вам не нужны.

^Washington County.*(?:\r?\n(?!\.[A-Z]+(?: [A-Z]+)?\.{3}|\$\$).*)*(?:\r?\n\.[A-Z]+(?: [A-Z]+)?\.\.\..*(?:\r?\n(?!\.[A-Z]+(?: [A-Z]+)?\.{3}|\$\$).*)*){2}\r?\n\.[A-Z]+(?: [A-Z]+)?\.{3}(?:(?!.*\bsevere\b).*(?:\r?\n(?!\.[A-Z]+(?: [A-Z]+)?\.{3}|\$\$).*)*\r?\n(?!\.[A-Z]+(?: [A-Z]+)?\.{3}|\$\$))?.*\b(severe)\b

Regex demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...