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~']
fonte
2016-03-31 10:50:16
'(? = (~. *? ~))' #overlapping_matches #lookahead –
Ho usato rubular [.] Com per verificare. Sembra che il primo ~ * abc ~ non venga rilevato dalla tua espressione regolare. – AbhishekAsh
@AbhishekAsh I requisiti e la stringa/l'output del campione non sono sincronizzati –