2017-04-02 1 views
0

Je n'arrive pas à comprendre ce que signifient les expressions régulières dans les lignes de code suivantes.l'analyse de l'expression régulière pour sub et gsub dans r

author = "10_1 A Kumar; Ahmed Hemani ; Johnny &Ouml;berg<" 

# after some experiment, it looks like this line captures whatever is in 
# front of the underscore. 
authodid = sub("_.*","",author) 

# this line extracts the number after the underscore, but I don't know 
# how this is achieved 
paperno <- sub(".*_(\\w*)\\s.*", "\\1", author) 

# this line extracts the string after the numbers 
# I also have no idea how this is achieved through the code 
coauthor <- gsub("<","",sub("^.*?\\s","", author)) 

j'ai lu sur la bande que le premier argument est le motif, le deuxième est le remplacement, et le troisième est l'objet à opérer. J'ai également vu quelques post sur SO et appris que \\w signifie le mot et \\s est un espace.

Cependant, certaines choses ne sont toujours pas claires. \\w signifie mot, cela signifie-t-il le mot suivant? Sinon, comment dois-je l'interpréter? J'ai appris que ^ correspond au début de la chaîne, mais qu'en est-il de la période après ^?

Plus important encore, quelle est l'interprétation de _.* Qu'en est-il .*_ Que diriez-vous de ^.*?\\s? Comment devrais-je les lire?

Merci!

+3

tapez ces choses ici https://regex101.com – rawr

+0

@rawr Quelle saveur devrais-je choisir? Il semble que tous montrent une erreur. – Waht

+1

[pcre devrait être bien] (https://regex101.com/r/sIb7Ql/1), je ne reçois pas d'erreur, peut-être que vous faites à cause du double \ qui ne sont pas nécessaires lorsque vous utilisez ce site Web – rawr

Répondre

1

Bien. Il y a un certain nombre de questions. Premières choses d'abord.

sub("_.*","",author) recherche _ et tout le reste après cela. Donc, dans votre cas _.* correspond à _1 A Kumar; Ahmed Hemani ; Johnny &Ouml;berg<. Fonction sub rechute avec '' (donc, de facto, il supprime), de sorte que vous vous retrouvez avec 10.

sub(".*_(\\w*)\\s.*", "\\1", author) est plus difficile (sans aucune raison). Ça n'extrait rien. Si vous remplacez le code par sub(".*_(\\w*)\\s.*", "222", author), le résultat sera 222 (au lieu de 1). Donc, tout ce que vous mettez dans le deuxième argument, vous obtiendrez en conséquence. Pourquoi ça? Eh bien, parce que ".*_(\\w*)\\s.*" correspond à la chaîne entière, à savoir: .*_ correspond à 10_; (\\w*) correspond à 1 et enfin \\s.* signifie l'espace et tout ce qui suit (donc, le reste de la chaîne).

gsub("<","",sub("^.*?\\s","", author)) Il existe deux fonctions. Le premier sub("^.*?\\s","", author). Il regarde tout du début à l'espace. Donc ^.*?\\s signifie 10_1 et supprimez-le. Donc, vous finissez avec A Kumar; Ahmed Hemani ; Johnny &Ouml;berg<. Et le second supprime «<» de partout.

J'espère que ça aide.

+0

Est-ce que la syntaxe correcte est la suivante: '_. *' Recherche tout ce qui suit '_' et effectue l'opération dessus,'. * _ 'Recherche tout ce qui précède _ _' et effectue l'opération dessus, et' ^. *? ' depuis le début jusqu'à ce qu'il trouve quelque chose de spécifié (dans mon cas, '\\ s', un espace) et fonctionne-t-il sur cela? – Waht

+0

@what La réponse courte est oui. – Vyga