Попытка извлечь ТОЛЬКО фамилию, используя регулярное выражение из списка - PullRequest
0 голосов
/ 23 декабря 2019

У меня возникли проблемы с извлечением фамилии из списка.

list = ['Cristiano Ronaldo', 'L. Messi', 'M. Neuer', 'L. Suarez', 'De Gea', 'Z. Ibrahimovic', 'G. Bale', 'J. Boateng', 'R. Lewandowski']

for item in list:
    print(item)
    print(re.findall(r'(\s(.*))', item))

Но вывод такой:

Cristiano Ronaldo
[(' Ronaldo', 'Ronaldo')]
L. Messi
[(' Messi', 'Messi')]
M. Neuer
[(' Neuer', 'Neuer')]
L. Suarez
[(' Suarez', 'Suarez')]
De Gea
[(' Gea', 'Gea')]
Z. Ibrahimovic
[(' Ibrahimovic', 'Ibrahimovic')]
G. Bale
[(' Bale', 'Bale')]
J. Boateng
[(' Boateng', 'Boateng')]
R. Lewandowski
[(' Lewandowski', 'Lewandowski')]

Мне интересно, почему последнееимена были возвращены дважды;Я хочу вернуть фамилии только один раз.

Может ли кто-нибудь из вас, добрые люди, помочь? Спасибо!

Ответы [ 4 ]

3 голосов
/ 23 декабря 2019

Вы создаете 2 группы с двумя парами скобок. Удалите внешнюю, и вы получите только фамилию:

list = ['Cristiano Ronaldo', 'L. Messi', 'M. Neuer', 'L. Suarez', 'De Gea', 'Z. Ibrahimovic', 'G. Bale', 'J. Boateng', 'R. Lewandowski'] 
for item in list: 
    print(item) 
    print(re.findall(r'\s(.*)', item))
3 голосов
/ 23 декабря 2019

Использование str.split() с отрицательной индексацией

Пример:

lst = ['Cristiano Ronaldo', 'L. Messi', 'M. Neuer', 'L. Suarez', 'De Gea', 'Z. Ibrahimovic', 'G. Bale', 'J. Boateng', 'R. Lewandowski']

for item in lst:
    print(item)
    print(item.split()[-1])

Выход:

Ronaldo
Messi
Neuer
Suarez
Gea
Ibrahimovic
Bale
Boateng
Lewandowski
1 голос
/ 23 декабря 2019

\S соответствует любому символу, который не является пробелом.

list = ['Cristiano Ronaldo', 'L. Messi', 'M. Neuer', 'L. Suarez', 'De Gea', 'Z. Ibrahimovic', 'G. Bale', 'J. Boateng', 'R. Lewandowski']

for item in list:
    print(item)
    print(re.findall(r'\S+$', item)) # match 1 or more non space before end of string

Вывод:

Cristiano Ronaldo
['Ronaldo']
L. Messi
['Messi']
M. Neuer
['Neuer']
L. Suarez
['Suarez']
De Gea
['Gea']
Z. Ibrahimovic
['Ibrahimovic']
G. Bale
['Bale']
J. Boateng
['Boateng']
R. Lewandowski
['Lewandowski']
0 голосов
/ 23 декабря 2019

Проверьте это https://regex101.com/r/CGrruO/1

Вы можете видеть, что ваше регулярное выражение возвращает 2 совпадения.
Вы добавили еще один набор (), чтобы получить два совпадения, одно с пробелом и одно без.

Изменение на \s(.*) должно работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...