2017-11-12 2 views
-1

Ich möchte Hashtags implementieren. Ich brauche ein richtiges Muster. Die Zeichenfolge muss mindestens eine Zahl oder ein Zeichen enthalten. bitte benutze nicht [a-zA-Z0-9], ich brauche nicht nur englische buchstaben. Verwenden Sie \ w +. Entschuldige mein schlechtes Englisch.Python korrekt Regex

#_ //bad 
#__ //bad 
#____d //good 
#_1 // good 
#______2 // good 
#d_2____ // good 
#python_regex___pattern_ // good 
+0

Englisch beiseite, was ist die Eingabezeichenfolge und was ist Ihre gewünschte Ausgabe? – skrubber

+0

str = '#python #_ruby #____ #__ #csharp____ # _12 # _1 #_____p #p___'. # Ausgabe: Python, _ruby, __ #csharp____, _12, _1, _____p, p___ – modestboy8

+0

Bearbeiten Sie Ihre Frage mit diesem und was ist Ihre gewünschte Ausgabe? – skrubber

Antwort

0

das folgende Muster übereinstimmt einen hashtag gefolgt von null oder mehr Unterstreichungszeichen gefolgt von einem oder mehrere nicht-Strich-Nicht-Leerzeichen von null oder mehr Unterstreichungs gefolgt Zeichen (wobei letztere zwei wiederholt ein oder mehr Male in einem nicht-Erfassungsgruppe):

p = re.compile('#_*(?:[^_\s]+_*)+') 

>>> bool(p.match('#d__')) 
True 
>>> bool(p.match('#__')) 
False 
>>> bool(p.match('#abc')) 
True 
>>> bool(p.match('#ab_c_')) 
True 
>>> p.findall('#_hashtag_abc_ hello #world') 
['#_hashtag_abc_', '#world'] 
+0

scheint nicht zu fangen '#python_regex___pattern_' – ValLeNain

+0

@ValLeNain True, aktualisiert ... – schwobaseggl

+0

auch bewusst sein, dass dies Dinge wie" # djsdjhé_èé'é'è "übereinstimmt (nicht in vielen Tags-Systemen autorisiert) – ValLeNain

0

du versuchen:

import re 
s = ['#d__', '#__', '#abc', '#ab_c_', '#python_regex___pattern_'] 
data = {i:bool(re.findall('\w+', i) and re.findall('_+', i)) for i in s} 

Ausgang:

{'#abc': False, '#d__': True, '#python_regex___pattern_': True, '#__': True, '#ab_c_': True} 
+0

#abc soll gültig sein – ValLeNain

+0

@ValLeNain Tatsächlich hat das OP nicht angegeben, ob ein Hashtag alle Buchstaben enthalten könnte. In der gewünschten Ausgabe des OPs hatten alle Hashtags mindestens ein "_" in ihnen. Daher wandte ich diese Logik auf diese Lösung an. – Ajax1234

0

Es sieht aus wie Sie einen regulären Ausdruck suchen, der

  1. beginnt mit einem #,
  2. bei Leasing ein _ enthält,
  3. eine nicht ascii alphanumerische enthält.

Das Problem mit \w hier ist, dass dieser Satz eine _ enthält und Python nicht \p{L} unterstützt alle Unicode Buchstaben übereinstimmen.

können Sie verwenden:

^#(?=.*_)(?=.*[^_\s]+).*$ 

Demo