#python #regex
Вопрос:
Я пытаюсь выбрать полузащитников(M) из этого списка игроков ниже, используя регулярное выражение. Я создал шаблон для проверки на:
mids=re.findall('[wsw:]*(?=sMn)',players)
однако я не получаю желаемого результата. Я был бы признателен за некоторую помощь в том, где я ошибся.
Lionel Messi: F
Cristiano Ronaldo: F
NGolo Kante: M
Ruben Dias: D
Toni Kroos: M
Sergio Ramos: D
Paul Pogba: M
Marcus Rashford: F
Harry Kane: F
Manuel Neuer G
David DeGea: G
Спасибо
Ответ №1:
Воспользуйся
^.*?(?=: *Ms*$)
См.Доказательство регулярного выражения.
объяснение
--------------------------------------------------------------------------------
^ the beginning of the string
--------------------------------------------------------------------------------
.*? any character except n (0 or more times
(matching the least amount possible))
--------------------------------------------------------------------------------
(?= look ahead to see if there is:
--------------------------------------------------------------------------------
: ':'
--------------------------------------------------------------------------------
* ' ' (0 or more times (matching the most
amount possible))
--------------------------------------------------------------------------------
M 'M'
--------------------------------------------------------------------------------
s* whitespace (n, r, t, f, and " ") (0
or more times (matching the most amount
possible))
--------------------------------------------------------------------------------
$ before an optional n, and the end of
the string
--------------------------------------------------------------------------------
) end of look-ahead
import re
p = r"^.*?(?=: *Ms*$)"
test_str = "Lionel Messi: F nCristiano Ronaldo: F nNGolo Kante: M nRuben Dias: D nToni Kroos: M nSergio Ramos: D nPaul Pogba: M nMarcus Rashford: F nHarry Kane: F nManuel Neuer G nDavid DeGea: G"
matches = re.findall(p, test_str, re.MULTILINE)
print(matches)
Результаты: ['NGolo Kante', 'Toni Kroos', 'Paul Pogba']
Комментарии:
1. Привет, @Ryszard , Могу я узнать
*
, что находится между:
иM
, чтобы получить как можно больше для:
илиM
?2. @balandongiv Это сопоставление нуля или более пробелов.
3. IIUC, ваше предложение состоит в том , чтобы сопоставить шаблон
:
space
иm
?, и если он совпадает, извлечь предыдущую строку ? Спасибо,