2017-04-13 10 views
0

möchte folgende Muster in einem String finden:RegexMuster String übereinstimmen

word-word-word++ oder -word-word-word++

also, dass sie die -word oder word- Muster bis zum Ende der Teilläuft.

Die Zeichenfolge ist ziemlich groß und enthält viele Wörter mit diesen^Mustern. Die folgende versucht worden:

p = re.compile('(?:\w+\-)*\w+\s+=', re.IGNORECASE) 
result = p.match(data) 

aber es gibt KEINE. Kennt jemand die Antwort?

+0

Try 'p.findall (Daten)' –

+0

Versuchen Sie auch, um das Muster prepend mit '-'?. Beachten Sie, dass Ihre Frage unklar ist. Bitte fügen Sie Beispieleingabe und erwartete Ausgabe hinzu - Ihre aktuelle Regex stimmt nicht mit Ihrer Beschreibung überein. –

+0

Warum hast du '=' am Ende? – vks

Antwort

1

Ihre Regex wird nur mit dem ersten Muster übereinstimmen, match() findet nur ein Vorkommen, und das nur, wenn unmittelbar danach einige Leerzeichen und ein Gleichheitszeichen folgen.

Auch Sie in Ihrem Beispiel implizieren Sie wollten, drei oder mehr Worte also hier ist eine Version, die auf folgende Weise geändert wurde:

  1. Spiel beider Muster (man beachte das führenden -?)
  2. Spiel nur wenn es mindestens drei Worte zu dem Muster ({2,} statt +)
  3. Spiel sind, auch wenn es nichts nach dem Muster (die \b entspricht eine Wortgrenze. Es ist nicht wirklich notwendig ist hier, seit dem vorhergehenden \w+ guara ntees wir sind sowieso an einer Wortgrenze)
  4. gibt alle Übereinstimmungen statt nur die erste zurück.

Hier ist der Code:

#!/usr/bin/python 

import re 

data=r"foo-bar-baz not-this -this-neither nope double-dash--so-nope -yeah-this-even-at-end-of-string" 
p = re.compile(r'-?(?:\w+-){2,}\w+\b', re.IGNORECASE) 
print p.findall(data) 
# prints ['foo-bar-baz', '-yeah-this-even-at-end-of-string'] 
+0

Das funktioniert, gibt viele Ergebnisse zurück. Vielen Dank – ndm