Как извлечь пару подстрок с определенными образцами, разделенными любыми символами в строке, используя Python Reg? - PullRequest
0 голосов
/ 29 января 2019

Необходимо получить 2 подстроки из строк.Две подстроки разделены несколькими символами, включая специальные символы, такие как двоеточия и знаки доллара, и т. Д. Две подстроки имеют свои определенные шаблоны соответственно.

Фон:

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

Следующие 3 строки являются примерами:

String[0] = 'Boys 10&U Event 1 2.32WBC aRc$-MW 9O%Abd, dL 2.3SV Dd$-MW 10Tzos, edResult, Final 93.1AB-ED Boys 13&O Event 1 e&12d &12C, Ac&c AcResult, Final 1.5ED-cA'

С String[0], необходимо получить

[('Boys 10&U Event 1', 'Result, Final 93.1'), ('Boys 13&O Event 1', 'Result, Final 1.5')]

String[1] =  'Boys 7&U Event 2 2.3B Rd$-ac %d, a 2@Ac Dd$-MW '

С String[1], нечего извлекать, так как событие не имеет результата.

String[2] = 'Boys 7&U Event 2 c3$ 13_E Boys 10&U Event 3 2.32WBC aRc$-MW 9O%Abd, dL 2.3SV Dd$-MW 10Tzos, edResult, Final 1.23AB-ED'

С String[2], необходимо получить

('Boys 10&U Event 3', 'Result, Final 1.23') and totally ignore 'Boys 7&U Event 2'.

Я использую следующий коддля обработки 3 строк выше, с s = String[0], String[1], String[2].

re.findall(r'(Boys \d+&\[A-Z]\s\Event\s\d*).*?(Result, Final\s\d*\.\d{2})[A-Z]*', s)

Код хорошо работает на String[0] и String[1], но не работает на String[2], так как извлекает имя первого спортивного события ирезультат 2-го спортивного события.

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

Спасибо!

1 Ответ

0 голосов
/ 29 января 2019

У вашего текущего регулярного выражения есть проблемы, из-за которых оно даже не соответствует ни одной из ваших строк.Например, в вашем регулярном выражении Final\s\d*\.\d{2} вы написали \d{2}, но в первом примере у вас есть только одна цифра в ожидаемых результатах, Final 93.1 и Final 1.5, из-за которой первая строка не дает совпадения.

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

(Boys\s+\S+\s+Event\s\d+)(?:(?!Boys).)*?(Result, Final\s\d*\.\d+)

Объяснение регулярного выражения:

  • (Boys - начинаетсяЗатем группа захвата соответствует Boys буквально
  • \s+\S+\s+ - Соответствует по крайней мере одному пробелу, затем по крайней мере одному непробельному пространству, а затем по крайней мере одному пробелу
  • Event\s\d+) - Соответствует Event буквально соответствует пробелу, затем одной или нескольким цифрам
  • (?:(?!Boys).)*? - эта часть соответствует любому символу ноль или более, кроме Boys, в результате чего выбирается ближайшая строка Boys к конечной строке.
  • (Result, Final\s\d*\.\d+) - запускает вторую группу захвата, затем сопоставляет Result, Final буквально, затем пробел, затем десятичное число, где необязательная часть целого числа

Demo

Пример кода Python,

import re

arr = ['Boys 10&U Event 1 2.32WBC aRc$-MW 9O%Abd, dL 2.3SV Dd$-MW 10Tzos, edResult, Final 93.1AB-ED Boys 13&O Event 1 e&12d &12C, Ac&c AcResult, Final 1.5ED-cA', 'Boys 7&U Event 2 2.3B Rd$-ac %d, a 2@Ac Dd$-MW ','Boys 7&U Event 2 c3$ 13_E Boys 10&U Event 3 2.32WBC aRc$-MW 9O%Abd, dL 2.3SV Dd$-MW 10Tzos, edResult, Final 1.23AB-ED']

for s in arr:
 print(re.findall(r'(Boys\s+\S+\s+Event\s\d+)(?:(?!Boys).)*?(Result, Final\s\d*\.\d+)',s))

Отпечатки,

[('Boys 10&U Event 1', 'Result, Final 93.1'), ('Boys 13&O Event 1', 'Result, Final 1.5')]
[]
[('Boys 10&U Event 3', 'Result, Final 1.23')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...