2017-08-21 3 views
0

Sagen Sie, dass ich ein Muster 123 * oder 1234 * gebe, ich möchte jede 10-stellige Zahl zusammenbringen, die mit diesem Muster beginnt. Es sollte genau 10 Ziffern haben.Regex, um 10 Stellen genau mit spezifischem Muster zu vergleichen

Beispiel:

Muster: 123 sollte 1234567890 12345678 überein, aber nicht

ich versuchte, diese regex: (^ (123) (\ d {0,10})) ((1) \ d {10}) .. offensichtlich hat es nicht funktioniert. Ich habe versucht, das Muster und die verbleibenden Ziffern als zwei verschiedene Gruppen zu gruppieren. Es entspricht 10 Ziffern nach der erfassten Gruppe (https://regex101.com/). Wie überprüfe ich, ob die erfasste Gruppe genau 10 Ziffern hat? Oder gibt es hier irgendwelche guten Tricks? Bitte führen Sie mich.

+0

Es ist schwierig zu helfen, wenn Sie das reale Szenario nicht erklären und den Code bereitstellen, mit dem Sie Probleme haben. Vielleicht brauchst du ['(?

+0

Ich habe versucht, die Telefonnummern zu sperren Beginnen Sie mit einem bestimmten Muster. Die Benutzer setzen jedes Blockierungsmuster wie 123 * oder 43 * etc .. also muss ich alle ein- und ausgehenden Daten blockieren, die mit diesem Muster übereinstimmen. Aber bevor ich auflege, muss ich wissen, warum der Anruf fehlgeschlagen ist, weil er eine falsche Anzahl von Ziffern oder ein blockiertes Muster gewählt hat, um die Nachricht richtig einzustellen. Dieser Regex \ b (? = 123) \ d {10} \ b von @randomir scheint das gelöst zu haben. Danke für deine Gedanken, die dabei helfen, das zu lösen. – Anandan

Antwort

2

Klingt wie ein Fall für die positive lookahead:

(?=123)\d{10} 

Dies wird jede Folge von genau 10 Ziffern entsprechen aber nur wenn Präfix 123 ist. Testen Sie es here.

ähnlich für Präfix 1234:

(?=1234)\d{10} 

Natürlich, wenn Sie die Präfixlänge im Voraus wissen, können Sie 123\d{7} verwenden, aber dann werden Sie Bereichsgrenzen bei jedem Präfix ändern ändern müssen (zum Beispiel: 1234\d{6}).


Zusätzlich zu gewährleisten, nur einzelne Gruppen von 10 Stellen erfasst werden, könnte man den obigen Ausdruck mit einer (Länge Null) Wortgrenze \b verankert werden soll:

\b(?=123)\d{10}\b 

oder, wenn Ihr Sequenz innerhalb des Wortes erscheinen, möchten Sie vielleicht negativ und Lookbehind Look-Ahead auf \d verwenden (wie in den Kommentaren von @Wiktor vorgeschlagen):

(?<!\d)(?=123)\d{10}(?!\d) 
+0

'(? = 123) \ d {10}' = '123 \ d {7}' –

+0

Natürlich, aber wie ich verstehe, möchte das OP Präfixe variieren, in diesem Fall ist es einfacher Lookahead zu verwenden, da der Rest von Regex ändert sich nicht. Ich habe eine Klarstellung hinzugefügt. – randomir

+1

Ja, aber es garantiert nicht wirklich, dass Sie nur eine 10-stellige Nummer erhalten, Sie können "1234567890" in "123456789" finden. –

1

würde ich es einfach halten:

import re 

text = "1234567890" 

match = re.search("^123\d{7}$|^1111\d{6}$", text) 
if match: 
    print ("matched") 

Sie Ihr 2-Muster in als solche werfen und es sollte gut zu gehen! Beachten Sie, dass 123 * würde 1234 fangen * also verwende ich 1111 \ d {6} als Beispiel

Verwandte Themen