2009-06-21 12 views
7

Domanda:
È possibile, con regex, abbinare una parola che contiene lo stesso carattere in diverse posizioni?È possibile abbinare una ripetizione di carattere con regex? Come?

Condizione:
Tutte parole hanno la stessa lunghezza, si conoscono le posizioni dei caratteri (ad esempio il 1 °, il 2 ° e il 4 °) del char ripetuto, ma non si sa di cosa si tratta.

Esempi:
usando le parole 6char minuscole che mi piacerebbe abbinare parole dove il 3 e il 4 caratteri sono gli stessi.

parrot <- match for double r 
follia <- match for double l 
carrot <- match for double r 
mattia <- match for double t 
rettoo <- match for double t 
melone <- doesn't match 

non posso usare il quantificatore [\ d] {2} perché corrisponde ad alcuna successione di due caratteri, e che cosa se dico il 2 ° e il 4 ° posto, invece di 3 ° e 4 °?

È possibile fare quello che voglio con regex? Se sì, come posso farlo?

EDIT:
Fai chiesto nei commenti, sto usando python

+2

I motori di espressioni regolari possono essere molto diversi tra lingue e strumenti. Quindi dovresti sempre dire con quale linguaggio o strumento stai lavorando (Perl? Python? Grep? C e una libreria?) – Telemachus

+0

fatto! Grazie! (15char) –

+0

Sono questi compiti? –

risposta

26

È possibile utilizzare un backreference per fare questo:

(.)\1 

Ciò corrisponderà ricorrenze consecutive di qualsiasi carattere.


Modifica Ecco qualche Python esempio:

import re 

regexp = re.compile(r"(.)\1") 
data = ["parrot","follia","carrot","mattia","rettoo","melone"] 

for str in data: 
    match = re.search(regexp, str) 
    if match: 
     print str, "<- match for double", match.group(1) 
    else: 
     print str, "<- doesn't match" 
+1

l'alternativa a questo è (aa | bb | cc | ..zz | AA | BB | lol) – dfa

+0

In ritardo, ma per riferimento potrebbe valere la pena notare che questa particolare espressione regexp corrisponde effettivamente alla prima ripetizione del carattere (re.search (r "(.) \ 1", "parrrrrot"). group (0) produce 'rr'). Per abbinare tutte le occorrenze (ed essere in grado di estrarre il gruppo ripetuto) potresti voler usare: re.search (r "((.) \ 2+)", "parrrrot"). Group (1) (che produce il corretto rispondi a 'rrrr') – Rick77

2

/(\b\w*?(\w)\2.*?\b)/

corrisponderà qualsiasi parola con atleast sul carattere ripetizione $ 1 è la parola $ 2 La prima ripetizione.

7

È necessario utilizzare riferimenti posteriori per tali casi. Non sono sicuro di quale lingua stai usando, ho provato il seguente esempio nel mio editor VI per cercare qualsiasi alfabeto che si ripete. schema di espressione regolare:\([a-z]\)\1

Se si vede l'esempio, [a-z] è il modello che si sta cercando, e racchiudono che all'interno del paranthesis (i parantheses dovrebbero essere sfuggito in alcune lingue). Una volta che hai una parestesia, è un gruppo e può essere rimandato in qualsiasi punto della regex usando \ 1. Se c'è più di un gruppo, puoi usare \ 1, \ 2 ecc. \ 1 sarà sostituito da qualsiasi cosa sia stata trovata nel primo gruppo.

Grazie Arvind

0

Sì, è possibile utilizzare backreference costrutto per abbinare le lettere doppie.

L'espressione regolare (?<char>\w)\k<char>, utilizzando i gruppi denominati e il backreferencing, ricerca i caratteri accoppiati adiacenti. Quando viene applicato alla stringa "Avrò un piccolo caffè", trova corrispondenze nelle parole "I'll", "small" e "coffee".Il metacarattere \w trova qualsiasi carattere di parola singola. Il costrutto di raggruppamento (?<char>) racchiude il metacarattere per forzare il motore delle espressioni regolari a ricordare una corrispondenza di sottoespressione (che, in questo caso, sarà un singolo carattere) e salvarla con il nome "char". Il costrutto backreference \k<char> fa sì che il motore confronti il ​​carattere corrente con il carattere precedentemente associato memorizzato in "char". L'intera espressione regolare trova con successo una corrispondenza ovunque un singolo carattere è uguale al precedente.

+0

Dovresti sempre usare i backtick oi blocchi di codice per formattare qualsiasi codice sorgente che includi nei tuoi post. Questa risposta non aveva alcun senso fino a quando non ho aggiunto dei backtick alle tue regex. –

+0

Oops !! Colpa mia! Grazie Alan :) –

Problemi correlati