2017-10-20 8 views
1

Je veuxComment lookbehind négatif pour les caractères spéciaux

  1. exclure toute phrase qui n'a pas ou pas moins que le non est suivi par deux points ou un point d'interrogation
  2. Je veux me débarrasser de toute phrase contenant un point d'interrogation ou un deux-points suivi d'un N ou Non ou non.

texte d'entrée:

N-Acetyl-cysteine used Yes or no?No. 
Acetic acid used Yes or no?Y. 
NBI used Yes or no? Y. 
Diaphragmatic pinch:40cm 
: Y -33cm. 
Inlet patch - Yes or No: N. 
No loss of stain. 

sortie souhaitée

Acetic acid used Yes or no?Y. 
NBI used Yes or no? Y. 
Diaphragmatic pinch:40cm 
: Y -33cm. 

tentative actuelle r:

gsub(".*[Nn][Oo](?![:]|[?]).*?(\\.|\n|:|$)", "", x[, y], perl = T) 

résultats dans:

N-Acetyl-cysteine used Yes or no?No. 
    Acetic acid used Yes or no?Y. 
    NBI used Yes or no? Y. 
    Diaphragmatic pinch:40cm 
    : Y -33cm. 
    Inlet patch - Yes or No: N. 

puis

gsub(".*[Nn][Oo](:|\\?)(\\s*).*?(\\.|\n|:|$)", "", x[, y]) 

résultats dans:

Diaphragmatic pinch:40cm 
: Y -33cm. 

Le premier gsub fonctionne très bien, mais la seconde ne débarrasse pas de obtient trop. Y a-t-il une meilleure manière de faire cela?

+0

[? Est-ce que vous avez besoin] (https://ideone.com/SGF2LT) –

+0

Votre deuxième réponse fonctionne comme un charme. S'il vous plaît poster comme une réponse. Si vous pouviez expliquer –

Répondre

1

Votre deuxième exigence doit inclure un espace facultatif entre le deux-points ou le point d'interrogation et N.

Le regex doit ressembler à

.*(?:no(?![?:])|[?:]\s*N).*\R* 

Voir la regex demo

Détails

  • .* - tout 0+ caractères autres que les caractères de saut de ligne
  • (?:no(?![?:])|[?:]\s*N) - non -capturer le matchi de groupe d'alternance ng ou l'autre des deux alternatives:
    • no(?![?:]) - no pas suivi avec ? ou :
    • | - ou
    • [?:]\s*N - un ? ou :, 0+ espaces blancs, N
  • .* - le reste de la ligne
  • \R* - toutes les séquences de rupture de ligne 0+.

L'argument perl=TRUE fait R analyser le motif avec le moteur de regex PCRE, et ignore.case=TRUE argument fait le cas de motif insensible.

Voici le fixed R code:

x <- "N-Acetyl-cysteine used Yes or no?No. 
Acetic acid used Yes or no?Y. 
NBI used Yes or no? Y. 
Diaphragmatic pinch:40cm 
: Y -33cm. 
Inlet patch - Yes or No: N. 
No loss of stain." 
cat(gsub(".*(?:no(?![?:])|[?:]\\s*N).*\\R*", "", x, perl=TRUE, ignore.case=TRUE), sep="\n") 

Sortie:

Acetic acid used Yes or no?Y. 
NBI used Yes or no? Y. 
Diaphragmatic pinch:40cm 
: Y -33cm. 
+0

, je viens juste de remarquer que l'expression regex reprend aussi des phrases comme "Une grande masse a été remarquée" vraisemblablement parce qu'elle capture tout "non" qui n'est pas suivi d'un "?" ou ":" alors que je voudrais aussi ne pas détecter les phrases où "non" fait partie d'un mot ... comment faire? J'ai essayé. * (?: non (?! [?:] | [A-Za-z]) | [?:] \\ s * N). * Mais pas de succès –

+1

Utilisez les limites de mots, '. * (?: \\ bno \\ b (?! [?:]) | [?:] \\ s * N). * \\ R * ', ou, pour l'appliquer aussi pour la deuxième alternative,'. * (?: \\ bno \\ b (?! [?:]) | [?:] \\ s * Non? \\ b). * \\ R * '. –

+0

Aha. Ok merci encore une fois –