2016-07-20 3 views
1

Ich habe eine ZeichenfolgeSplitting ein String re-Modul von Python mit

s = 'count_EVENT_GENRE in [1,2,3,4,5]' 
#I have to capture only the field 'count_EVENT_GENRE' 
field = re.split(r'[(==)(>=)(<=)(in)(like)]', s)[0].strip() 
#o/p is 'cou' 
# for s = 'sum_EVENT_GENRE in [1,2,3,4,5]' o/p = 'sum_EVENT_GENRE' 

die

Meine Zweifel ist in Ordnung ist für jeden Charakter in (in)(like) die Zeichenfolge s an diesem Charakter spaltet und mir zuerst slice. (wie nach "cou" findet es eine passende char i: e n). Es passiert für jede Zeichenfolge, die ein beliebiges Zeichen aus (in)(like) enthält.

Ex: 'percentage_AMOUNT' o/p = 'p'

, wie es nach p ein passendes Zeichen als 'e' findet.

Also ich möchte einen Rat wie man (in) (wie) als Wörter nicht als Zeichen behandelt, wenn Spaltung auftritt/Angelegenheiten.

Bitte schlagen Sie eine Syntax vor.

+2

Vielleicht brauchen Sie 'r '[=><] = | in | like'' –

+0

Was ist die gewünschte Ausgabe für diesen Eingang? Warum? –

+1

Die '[]' stimmen nur mit einem Zeichen in dieser Wortliste überein, also "entweder (oder = oder) oder> oder i oder n oder l oder k oder e". Du meinst wahrscheinlich '(== |> = | <= | in | like)' – cdarke

Antwort

1

Die [(==)(>=)(<=)(in)(like)] Antwort auf Ihre Frage ist eine Zeichenklasse, die einzelnen Zeichen entspricht, die Sie innerhalb der Klasse definiert haben. Um Sequenzen von Zeichen übereinstimmen, müssen Sie [ und ] und Verwendung Wechsel entfernen:

r'==?|>=?|<=?|\b(?:in|like)\b' 

oder besser:

r'[=><]=?|\b(?:in|like)\b' 

Sie code würde wie folgt aussehen:

import re 
ss = ['count_EVENT_GENRE in [1,2,3,4,5]','coint_EVENT_GENRE = "ROMANCE"'] 
for s in ss: 
    field = re.split(r'[=><]=?|\b(?:in|like)\b', s)[0].strip() 
    print(field) 

Allerdings gibt möglicherweise andere (einfacher oder sicherer - abhängig von den tatsächlichen Spezifikationen) Möglichkeiten, um zu bekommen, was Sie wollen (Splitting mit Raum und bekommen th erste Element e, verwenden re.match mit r'\w+' oder r'[a-z]+(?:_[A-Z]+)+', etc.)

Wenn Ihr Wert zu Beginn der Zeichenfolge ist und beginnt mit Klein ASCII-Buchstaben, und dann eine beliebige Menge von Sequenzen von _ haben mit Groß ASCII gefolgt Buchstaben verwenden:

re.match(r'[a-z]+(?:_[A-Z]+)*', s) 

Full demo code:

import re 
ss = ['count_EVENT_GENRE in [1,2,3,4,5]','coint_EVENT_GENRE = "ROMANCE"'] 
for s in ss: 
    fieldObj = re.match(r'[a-z]+(?:_[A-Z]+)*', s) 
    if fieldObj: 
     print(fieldObj.group()) 
+0

falls s = 'coint_EVENT_GENRE = "ROMANCE"'. schau dir an, wie es ist. Wenn ich also r '[=><] = | in | like' anwende, gibt es mir 'co', indem ich bei 'in' durch co + in + t spalte. So r '\ w +' wird besser sein ..Aber wie vermeidet man das von r '[=><] = | in | like', indem man in dieser Syntax \ w + \ w hinzufügt. – Satya

+0

Verwenden Sie Wortgrenzen: 'r '[=><] =? | \ B (?: In | like) \ b'' und ich sehe, dass Sie eine einzige' = 'haben - dann müssen Sie das' = 'machen optional durch Anhängen von '?' danach. Warum nicht 're.match (r '[a-z] + (?: _ [A-Z] +) *', s)'? –

1

Wenn Sie nur das erste Wort Ihrer strin wollen g, dann sollte dies die Arbeit machen:

import re 
s = 'count_EVENT_GENRE in [1,2,3,4,5]' 
field = re.split(r'\W', s)[0] 
# count_EVENT_GENRE 
1

Gibt es etwas falsch mit split verwenden?

>>> s = 'count_EVENT_GENRE in [1,2,3,4,5]' 
>>> s.split(' ')[0] 
'count_EVENT_GENRE' 
>>> s = 'coint_EVENT_GENRE = "ROMANCE"' 
>>> s.split(' ')[0] 
'coint_EVENT_GENRE' 
>>> 
+0

Ich erwähnte das tatsächlich in meiner Antwort (siehe * Aufteilung mit Leerzeichen und das erste Element *). "Split" stellt jedoch nicht sicher, dass die Teilzeichenfolge ein bestimmtes Muster erfüllt, und wenn Sie eine beliebige Zeichenfolge angeben, wird immer der erste Nicht-Leerzeichen-Block zurückgegeben. –

+1

Schön gemacht und am einfachsten. Vielen Dank. Aber ich muss etwas mehr Parsing auf dem o/p anwenden und habe mehr Kategorien, für die @Wiktor Antwort mir einen zukünftigen Einblick gab. Also muss ich Wiktors Antwort akzeptieren. Ich habe Ihre Lösung aktualisiert. Danke noch einmal. – Satya

+0

@ WiktorStribiżew Sorry Wiktor, Ich habe Ihren Verweis auf split –