1
votes

Comment extraire un nom d'une chaîne dans re

J'ai un champ qui contient des noms structurés comme

abc | nom, prénom | xyz

Comment extraire uniquement le nom étant donné qu'il s'agit toujours du nom de famille, virgule, prénom entre les symboles de barre verticale?

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

Il renvoie soit vide, soit valeurs nulles en utilisant cette approche.


2 commentaires

les symboles de tube littéral doivent être échappés dans une expression régulière, par exemple (^ \ | \ s. +, \ s. + \ | $)


@beginnerds L'une des réponses fournies vous a-t-elle été utile ?


3 Réponses :


0
votes

Vous pouvez utiliser cette expression régulière:

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

Démo: Ici


0 commentaires

0
votes

En supposant que les symboles de tube sont réellement dans la chaîne, et en supposant que vos caractères sont déjà une chaîne (ou peuvent être transformés en chaîne en entourant les caractères entre les symboles de guillemets), puis en utilisant le package stringr avec le str_extract () la fonction peut faire l'affaire. Si le nom ou le prénom sont en majuscules, ce code devra être changé.

En gros, concentrez-vous simplement sur la correspondance du caractère le plus simple, la virgule. Ensuite, une fois que vous avez une correspondance, construisez votre modèle petit à petit et faites-en de plus en plus après cette première correspondance jusqu'à ce que vous ayez correspondu à ce que vous vouliez.


0 commentaires

0
votes

Vous pouvez utiliser un groupe de capture et une classe de caractères inversés [^ ...] pour faire correspondre n'importe quel caractère sauf ceux qui sont répertoriés.

La valeur se trouve dans le premier groupe de capture .

Remarque pour échapper le tube en dehors de la classe de caractères.

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

Dans les parties

  • ^ Début de chaîne
  • [^ \ r \ n |] * Correspond à 0 fois ou plus, pas un tube ni une nouvelle ligne
  • \ | \ s + Faire correspondre une barre verticale et 1+ caractères d'espacement
  • ( Capturer le groupe 1
    • [^ \ r \ n, |] + Correspond à 1+ fois pas une virgule, un tube ou une nouvelle ligne
    • , Faire correspondre la virgule
    • [^ \ r \ n, |] + Correspond à 1+ fois pas une virgule, un tube ou une nouvelle ligne
  • ) Fermer le groupe
  • \ | Faire correspondre un tube

Démo Regex

Le . + partie de votre motif ou [^ \ r \ n, |] correspondra également à une chaîne vide comme nom.

Vous pourriez par exemple faire correspondre la première un caractère a-zA-Z ou spécifiez ce que vous voulez autoriser pour empêcher un prénom ou un nom vide.

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

Démo Regex


0 commentaires