2017-04-25 10 views
0

Ich habe eine Zeichenfolge:regex oder replace() mit Platzhalter?

a (45:45) b (65:40) ccc (blah$#)

Ich will alles entfernen, die im Inneren des () sind, einschließlich der () wie folgt aussehen:

a b ccc

Ich wollte versuchen, wrestle mit re aber dachte vielleicht könnte es mit einem Wildcard und replace() getan werden. Ich möchte re vermeiden, wenn möglich.

+0

was tun willst du mit dem Leerzeichen machen? – hop

Antwort

1

Sie benötigen re, um Platzhalter zu verwenden. Ich meine, du könntest die Saite manuell zerlegen, aber das scheint eine riesige Zeitverschwendung zu sein.

import re 

s = 'a (45:45) b (65:40) ccc (blah$#)' 
print re.sub('\s?\(.*?\)', '', s).strip() # 'a b ccc' 
+0

Halfway anständig, aber wird fehlschlagen, wenn 's' mit einer Gruppe in Parens beginnt. – hop

+0

@hop Die erste Übereinstimmung wurde entfernt, sodass die Zeichenfolge mit einer Gruppe beginnen kann. Die Ausgabe könnte mit einem Leerzeichen beginnen, aber ich habe momentan keine Zeit, das auszubügeln. –

1

Sie haben Recht: reguläre Ausdrücke sollten nicht immer das erste Werkzeug, das in den Sinn kommt, wenn Strings Parsen, vor allem, wenn es potenziell beteiligten Strukturen verschachtelt werden könnten.

Es ist relativ einfach, die Klammern zu zählen und entsprechend handeln:

def filter_parens(sentence): 
    result, level = [], 0 
    for c in sentence: 
     if c == '(': 
      level += 1 
     elif c == ')': 
      level = max(0, level-1) 
     elif level == 0: 
      result.append(c) 
    return ''.join(result) 

Mit etwas Phantasie kann man es verlängern Klammern oder von Whitespace elminate auch:

def filter_parens(sentence): 
    result, level, whitespace = [], 0, False 
    for c in sentence: 
     if c == '(': 
      level += 1 
      continue 

     if c == ')': 
      level = max(0, level-1) 
      continue 

     if level: 
      continue 

     if c.isspace() and not whitespace: 
      whitespace = True 
      result.append(c) 
      continue 

     if c.isspace(): 
      continue 

     whitespace = False 
     result.append(c) 

    return ''.join(result) 
+0

Dies ist eine feine Lösung * wenn * verschachtelte Strukturen beteiligt sind. Aber es ist vielleicht erwähnenswert, dass dies in Situationen, in denen ein Ein-Zeilen-Regex genügen würde, zu viel ist. –

+0

Nun, die anderen Antworten hier inspirieren nicht viel Vertrauen in Regex-Lösungen. Auch das OP hat darum gebeten. – hop