Извлекать имена из текста

#r #regex

#r #регулярное выражение

Вопрос:

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

Обратите внимание, цифры 1-15 указывают позиции, и после каждой позиции всегда есть два имени (игрок хозяев и игрок гостей).

Вот эта строка:

 "Team Sheets     #            LIO Lions      RPI             JAG Jaguares      RPI     1        Dylan Smith     83           Juan Pablo Zeiss     59     2        Malcolm Marx     90           Julian Montoya     73     3        Carlu Sadie     78           Enrique Pieretto Heilan     54     4        Ruan Vermaak     72           Guido Petti Pagadizaval     77     5        Rhyno Herbst     72           Matias Alemanno     67     6        Marnus Schoeman     82           Juan Manuel Leguizamon     58     7        Vincent Tshituka     64           Marcos Kremer     55     8        Kwagga Smith     88           Rodrigo Bruni     62     9        Ross Cronje     74           Martin Landajo     52     10        Elton Jantjies     80           Joaquin Diaz Bonilla     62     11        Courtnall Skosan     76           Emiliano Boffelli     75     12        Franco Naude     52           Bautista Ezcurra     66     13        Wandisile Simelane     73           Matias Moroni     75     14        Sylvian Mahuza     76           Sebastian Cancelliere     65     15        Andries Coetzee     73           Joaquin Tuculet     68      Substitutes      #            LIO Lions      RPI             JAG Jaguares      RPI     16        Pieter Jansen     58           Gaspar Baldunciel     61     17        Nathan McBeth     60           Santiago Garcia Botta     65     18        Frans van Wyk     58           Santiago Medrano     72     19        Stephan Lewies     81           Tomas Lavanini     68     20        James Venter     61           Tomas Lezana     62     21        Dillon Smit     61           Tomas Cubelli     63     22        Harold Vorster     69           Juan Cruz Mallia     66     23        Gianni Lombard     64           Ramiro Moyano     78"
  

Итак, в основном то, что я хочу, — это просто список имен с названиями команд в качестве заголовков, например

 Lions            Jaguares

Dylan Smith      Juan Pablo Zeiss
Malcolm Marx     Julian Montoya
...              ...
  

Любая помощь была бы высоко оценена!

Комментарии:

1. Просто предложение — похоже, данные уже представлены в табличной форме. Возможно, было бы намного логичнее и проще прочитать его как фрейм данных. Так ли это?

Ответ №1:

Хотя я согласен с комментарием R.S. о прямом чтении данных как dataframe, вот мое решение с использованием регулярного выражения:

 # build a "player name - RPI" pattern
pattern = "[a-zA-Z] (\s[a-zA-Z] ) \s \d{1,2}"

# find all matches in string
m = gregexpr(pattern, x)

# extract all matches from string
plyrs = regmatches(x, m)[[1]]

# build dataframe
data.frame(lions = plyrs[c(TRUE, FALSE)],
           jaguares = plyrs[c(FALSE, TRUE)],
           stringsAsFactors=FALSE)
  

Ответ №2:

Прежде всего, вы могли бы попытаться создать структуру таблицы вместо огромной длинной строки. Что-то подобное могло бы дать вам небольшое начало.

 data = 'Team Sheets     #            LIO Lions      RPI             JAG Jaguares      RPI     1        Dylan Smith     83           Juan Pablo Zeiss     59     2        Malcolm Marx     90           Julian Montoya     73     3        Carlu Sadie     78           Enrique Pieretto Heilan     54     4        Ruan Vermaak     72           Guido Petti Pagadizaval     77     5        Rhyno Herbst     72           Matias Alemanno     67     6        Marnus Schoeman     82           Juan Manuel Leguizamon     58     7        Vincent Tshituka     64           Marcos Kremer     55     8        Kwagga Smith     88           Rodrigo Bruni     62     9        Ross Cronje     74           Martin Landajo     52     10        Elton Jantjies     80           Joaquin Diaz Bonilla     62     11        Courtnall Skosan     76           Emiliano Boffelli     75     12        Franco Naude     52           Bautista Ezcurra     66     13        Wandisile Simelane     73           Matias Moroni     75     14        Sylvian Mahuza     76           Sebastian Cancelliere     65     15        Andries Coetzee     73           Joaquin Tuculet     68      Substitutes      #            LIO Lions      RPI             JAG Jaguares      RPI     16        Pieter Jansen     58           Gaspar Baldunciel     61     17        Nathan McBeth     60           Santiago Garcia Botta     65     18        Frans van Wyk     58           Santiago Medrano     72     19        Stephan Lewies     81           Tomas Lavanini     68     20        James Venter     61           Tomas Lezana     62     21        Dillon Smit     61           Tomas Cubelli     63     22        Harold Vorster     69           Juan Cruz Mallia     66     23        Gianni Lombard     64           Ramiro Moyano     78'
import re
data = re.sub(r'(s)1{1,}', r'1', data)
data = re.sub(r'RPIs(d )', r'n1', data)
data = re.sub(r'(#)s', r'n1', data)
print(re.sub(r'd s(d )', r'n1', data))