2016-09-30 3 views
1

Ich versuche, einen regulären Ausdruck (in Python) zu schreiben, um Eingaben von einem Benutzer zu entsprechen. Ich versuche, den "Namen" und die "Nummer" aus dem Eingang zu greifen.Eine Regex schreiben, um ankommenden Chat zu entsprechen

Aktuelle Regex:

^(?P<start_number>\d+){0,1} (?P<name>.+)|^(?P<name2>.+?)(?:\s+){0,1}(?P<end_number>\d+){0,1}$ 

Eingänge sind:

  1. foo 1
  2. foo 2 kann dieser Text nicht erfassen
  3. 3 foo
  4. 4 foo Erfassung dieser Text
  5. foo 1 2 3

Was ich aufnehmen möchten:

  1. Name: foo, num: 1
  2. Name: foo, num: 2
  3. Name: foo, num: 3
  4. Name: foo erfassen sie diesen Text, num: 4
  5. Name: foo, num: 1

Mein Problem ist, dass aufgrund der "$" es Vs. Wenn ich das "$" lösche, fängt es nur den ersten Buchstaben des Strings für 1,2,5

Irgendwelche Ideen?Ich verwende regex101 mich

+1

Try [ '^ (? :(P \ d +) | (? P . *?)? (? P \ d +). *) $ '] (Https://regex101.com/r/8pfVZR/1) –

Antwort

0

Ich schlage vor,

Dank zu helfen:

^(?:(?P<start_number>\d+) (?P<name>.+)|(?P<name2>.*?) ?(?P<end_number>\d+).*)$ 

Siehe regex demo

Einzelheiten:

  • ^ - Beginn der Zeichenfolge
  • (?:(?P<start_number>\d+) (?P<name>.+)|(?P<name2>.*?) ?(?P<end_number>\d+).*) - eine nicht-einfangende Gruppe passenden 1 von 2 Alternativen
    • (?P<start_number>\d+) (?P<name>.+) - 1+ digits (Group "start_number"), ein Raum (mit \s+ ersetzt sein kann) und jedes 1+ Zeichen außer Zeilenumbruch-Sequenz eingefangen in Gruppe „name“
    • | - oder
    • (?P<name2>.*?) ?(?P<end_number>\d+).* - irgend 0+ Zeichen außer Zeilenumbrüche Symbole in Gruppen „name2“ erfasst, einem optionalen Raum (scheint, wie Sie \s* hier auch verwenden können) und dann 1+ Ziffern erfasst in Gruppe "end_number" und dann alle 0 + Zeichen bis zum Rest der Zeile
  • $ - Ende der Zeichenkette

An online test: (. P +)

import re 
s = ['foo 1', 
"foo 2 don't capture this text", 
'3 foo', 
'4 foo capture this text', 
'foo 1 2 3'] 
pat = r'^(?:(?P<start_number>\d+) (?P<name>.+)|(?P<name2>.*?) ?(?P<end_number>\d+).*)$' 
for x in s: 
    m = re.search(pat, x) 
    if m and m.group("start_number"): 
     print("{0}, {1}".format(m.group("start_number"), m.group("name"))) 
    elif m and m.group("end_number"): 
     print("{0}, {1}".format(m.group("end_number"), m.group("name2"))) 
+0

Ich vermasselt, und vergessen zu erwähnen, dass manchmal die Nummer ist nicht einmal da. E.G eine gültige Eingabe ist "foo" und ich muss das als Name erfassen. Diese Antwort funktioniert für meine ursprüngliche Frage, jetzt versuche ich sie zu bearbeiten, um "foo" "foo bar" usw. zu entsprechen – Woody

+0

Vielleicht, fügen Sie eine weitere Alternative hinzu: ['^ (? :(? P \ d +) (? P . +) | (? P . *?)? (? P \ d +). *? | (? P . *)) $ '] (Https://regex101.com/r/ 8pfVZR/2) –

Verwandte Themen