#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))