2016-03-31 15 views
5

Vorrei trovare tutte le possibili occorrenze di testo racchiuse tra due ~ s.Regex per trovare tutte le occorrenze possibili di testo che inizia e termina con ~

Ad esempio: Per il testo ~*_abc~xyz~ ~123~, voglio le seguenti espressioni come modelli corrispondenti:

  1. ~*_abc~
  2. ~xyz~
  3. ~123~

Nota può essere un alfabeto o un cifre.

Ho provato con il regex ~[\w]+?~ ma non mi sta dando ~xyz~. Voglio che ~ venga riconsiderato. Ma non voglio solo ~~ come possibile corrispondenza.

+0

'(? = (~. *? ~))' #overlapping_matches #lookahead –

+0

Ho usato rubular [.] Com per verificare. Sembra che il primo ~ * abc ~ non venga rilevato dalla tua espressione regolare. – AbhishekAsh

+1

@AbhishekAsh I requisiti e la stringa/l'output del campione non sono sincronizzati –

risposta

5

Utilizzare capturing inside a positive lookahead con la seguente espressione regolare:

A volte, si ha bisogno di diverse partite all'interno della stessa parola. Ad esempio, supponiamo che da una stringa come ABCD desideri estrarre ABCD, BCD, CD e D. Si può fare con questo singolo regex:

(?=(\w+))

Alla prima posizione nella stringa (prima della A), il motore si avvia al primo tentativo partita. Il lookahead afferma che ciò che segue immediatamente la posizione corrente è uno o più caratteri di parole e cattura questi caratteri nel Gruppo 1. Il lookahead ha successo, e così anche il tentativo di corrispondenza. Dal momento che il pattern non corrispondeva a nessun personaggio reale (il lookahead sembra solo), il motore restituisce una corrispondenza a larghezza zero (la stringa vuota). Restituisce anche ciò che è stato catturato dal Gruppo 1: ABCD

Il motore si sposta quindi nella posizione successiva nella stringa e inizia il tentativo successivo di corrispondenza. Anche in questo caso, il lookahead afferma che ciò che segue immediatamente quella posizione sono i caratteri della parola e cattura questi caratteri nel Gruppo 1. La corrispondenza ha esito positivo e il Gruppo 1 contiene BCD.

Il motore si sposta nella posizione successiva nella stringa e il processo si ripete per CD quindi D.

Quindi, utilizzare

(?=(~[^\s~]+~)) 

Vedere la regex demo

Il modello (?=(~[^\s~]+~)) controlla ogni posizione all'interno di una stringa e ricerche per ~ seguita con 1+ caratteri diversi spazi e ~ e poi seguito con un altro ~. Poiché l'indice viene spostato solo dopo aver controllato una posizione e non quando il valore è catturato, le sottostrutture sovrapposte vengono estratte.

Python demo:

import re 
p = re.compile(r'(?=(~[^\s~]+~))') 
test_str = " ~*_abc~xyz~ ~123~" 
print(p.findall(test_str)) 
# => ['~*_abc~', '~xyz~', '~123~'] 
+0

[2 downvotes] (http://stackoverflow.com/a/36330565/3832970) in un tratto all'interno di alcuni secondi ... Qualcuno è davvero offeso. Non ho idea di chi sia. –

+0

La tua risposta mi stupisce sempre – rock321987

+0

@ rock321987 grazie. Questa è una consolazione in momenti come questo. –

-1

Prova questo [^~\s]*

Questo modello non prende in considerazione i caratteri ~ e lo spazio (riferito come \s).

L'ho provato, funziona sulla stringa, ecco the demo.