Использование регулярного выражения для выбора игроков из списка на основе символа конца строки

#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 ?, и если он совпадает, извлечь предыдущую строку ? Спасибо,