Как извлечь имя из строки в ре - PullRequest
1 голос
/ 12 октября 2019

У меня есть поле, содержащее имена, структурированные как

abc |фамилия, имя |xyz

Как мне извлечь только имя, учитывая, что это всегда имя, фамилия, запятая между символами канала?

df['colname'].str.extract(pat = '(^|\s.+,\s.+|$)')

Возвращает пустые или нулевые значения, используяэтот подход.

Ответы [ 3 ]

0 голосов
/ 12 октября 2019

Предполагая, что символы канала на самом деле находятся внутри строки, и предполагая, что ваши символы уже являются строкой (или могут быть превращены в строку, заключив символы в символы кавычек), затем используйте пакет stringr с str_extract ()функция может сделать свое дело. Если фамилия или имя пишутся с большой буквы, этот код необходимо будет изменить.

В основном, просто сосредоточьтесь на сопоставлении самого простого символа - запятой. Затем, когда у вас есть совпадение, постройте свой шаблон понемногу и подбирайте все больше и больше после первого матча, пока не найдете то, что хотели.

library(stringr)

names <- "abc | lastname, firstname | xyz"    # create a string
print(names)     

str_extract(names, "[a-z]*, [a-z]*")          # extract the names


[1] "abc | lastname, firstname | xyz"      # printed string

'lastname, firstname'                      # output
0 голосов
/ 12 октября 2019

Вы можете использовать группу захвата и класс отрицательных символов [^...] для сопоставления с любым символом, кроме перечисленных.

Значение находится в первой группе захвата.

Обратите внимание на выход из канала вне класса символов.

^[^\r\n|]*\|\s+([^\r\n,|]+,[^\r\n,|]+)\|

По частям

  • ^ Начало строки
  • [^\r\n|]* Соответствие 0+ разне труба или перевод строки
  • \|\s+ Соответствует трубе и 1+ пробельных символов
  • ( Захват группа 1
    • [^\r\n,|]+ Соответствие1+ раз не запятая, труба или новая строка
    • , Соответствует запятой
    • [^\r\n,|]+ Совпадение 1+ раз не запятая, трубка или новая строка
  • ) Закрыть группу
  • \| Соответствовать трубе

Regex demo

Часть .+ вваш шаблон или [^\r\n,|] также будет соответствовать пустой строке в качестве имени.

Вы можете, например, сначала сопоставить символ a-zA-Z или указать, что вы хотите разрешить, чтобы предотвратить пустое имя или фамилию.

^[^\r\n|]*\|\s+([A-Za-z][^\r\n,|]*,\s*[A-Za-z][^\r\n,|]*)\|

Regex demo

0 голосов
/ 12 октября 2019

Вы можете использовать это регулярное выражение:

([a-zA-Z]+)\s*,\s*([a-zA-Z]+)

Демо: Здесь

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