2015-07-14 8 views
7

Lassen Sie uns sagen, dass ich eine Zeichenfolge wie dieses:Wie Klammern zu entfernen, nur um einzelne Wörter in einem String

s = '((Xyz_lk) some stuff (XYZ_l)) (and even more stuff (XyZ))' 

Ich möchte die Klammern entfernen, nur um einzelne Wörter so, dass ich erhalten:

'(Xyz_lk some stuff XYZ_l) (and even more stuff XyZ)' 

Wie würde ich das in Python tun? Bisher konnte ich nur, um sie mit dem Text entfernen entlang durch die Verwendung

re.sub('\(\w+\)', '', s) 

die

'(some stuff) (and even more stuff)' 

gibt Wie kann ich nur die Klammern entfernen und den Text innerhalb sie behalten?

Antwort

15
re.sub(r'\((\w+)\)',r'\1',s) 

Verwenden Sie \1 oder Rückverweis.

+0

Danke, funktioniert gut! Kasra benutzt \ b in seiner Antwort. Irgendein Grund, warum Sie es nicht benutzen? Ich habe deine Antwort verbessert, genauso wie es gut funktioniert. – Cleb

+1

@Cleb wir brauchen es nicht als '\ b' ist Wortgrenze und' \ w' wird nur Wörter und wir haben '()' um es.So brauchen wir es überhaupt nicht – vks

+0

Ok, danke für die Klarstellung. Würde es Ihnen etwas ausmachen, darüber zu arbeiten, wie das \ 1 funktioniert? Habe nicht viel Erfahrung in diesem Thema ... – Cleb

5

Sie können mit Rückverweis (eigentlich in sub Funktion nannten sie Gruppenreferenznummern):

>>> s='((Xyz_lk) some stuff (XYZ_l)) (and even more stuff (XyZ))' 
>>> 
>>> re.sub(r'\((\w+)\)',r'\1',s) 
'(Xyz_lk some stuff XYZ_l) (and even more stuff XyZ)' 
>>> 

Für weitere Informationen lesen Sie die folgende Erklärung über Rückreferenzierungen von http://www.regular-expressions.info/backref.html:

Rückverweise das Match der gleiche Text wie zuvor von einer einfangenden Gruppe. Angenommen, Sie möchten ein Paar öffnende und schließende HTML-Tags und den Text dazwischen zuordnen. Durch Einfügen des öffnenden Tags in eine Rückwärtsreferenz können wir den Namen des Tags für das schließende Tag wiederverwenden. Hier ist wie: <([A-Z][A-Z0-9]*)\b[^>]*>.*?</\1>. Diese Regex enthält nur ein Paar Klammern, die die von [A-Z][A-Z0-9]* übereinstimmende Zeichenfolge erfassen. Dies ist das öffnende HTML-Tag. (Da HTML-Tags die Groß-/Kleinschreibung nicht berücksichtigen, erfordert diese Regex eine Unterscheidung ohne Berücksichtigung der Groß-/Kleinschreibung.) Die Rückreferenz \1 (Backslash) verweist auf die erste erfassende Gruppe. \1 entspricht genau dem Text, der von der ersten Erfassungsgruppe gefunden wurde. Die / vor es ist ein Literalzeichen. Es ist einfach der Schrägstrich in dem schließenden HTML-Tag, dem wir zu entsprechen versuchen.

+0

Danke! Funktioniert gut. Warum werden die \ b benötigt? In der Antwort von vks sind sie nicht enthalten. Irgendein bestimmter Grund dafür? Ich habe die Antwort verbessert, da sie die Frage beantwortet. – Cleb

+0

Wegen der Natur von "w" sind Grenzen redundant, d. H. Der Effekt ist derselbe, ob Grenzen in der Regex enthalten sind oder nicht. Es ist jedoch gut, sie im Allgemeinen zu verwenden. @Cleb, von 'pydoc re':' \ b - Entspricht der leeren Zeichenfolge, aber nur am Anfang oder Ende eines Wortes. ' – werkritter

+0

@Cleb Kurz gesagt, Wortgrenzen zwangen Ihre Regex-Engine dazu, nur verkettete Zeichen zu finden, die es waren gemacht von der Regex innerhalb der in diesem Fall lesen Sie mehr http://www.regular-expressions.info/wordboundaries.html werkritter ist richtig, Sie brauchen keine Wortgrenze in diesem Fall – Kasramvd

Verwandte Themen