Ich habe eine Textdatei wie -

{[a] abc (b(c)d)}

Ich möchte den Inhalt zwischen diesen Klammern [] and (()) entfernen. so sollte die Ausgabe sein -

 abc

Ich habe den Inhalt zwischen Klammern entfernt, konnte den Inhalt zwischen diesen [] jedoch nicht entfernen. Ich habe unten Code versucht -

import re

with open('data.txt') as f:
    input = f.read()
    line = input.replace("{","")
    line = line.replace("}","")
    output = re.sub(r'\(.*\)', "", line)
    print output

Die Ausgabe ist -

[a] abc

In meinem Code ersetze ich zuerst das {} und entferne dann den Inhalt von (). Ich möchte \[.*\] in output = re.sub(r'\(.*\)', "", line) dieser Zeile einfügen. Konnte aber keinen Weg finden, dies zu tun. Ich lerne immer noch Python. Ich stehe also vor diesem Problem. Bitte helfen Sie.

2
jan 19 Apr. 2018 im 11:12

2 Antworten

Da es nicht so einfach ist, wie es zunächst aussehen mag, würden Sie höchstwahrscheinlich einen ausgewogenen (rekursiven) Ansatz benötigen, der mit neueres regex Modul :

import regex as re

string = "some lorem ipsum {[a] abc (b(c)d)} some other lorem ipsum {defg}"

rx_part = re.compile(r'{(.*?)}')
rx_nested_parentheses = re.compile(r'\((?:[^()]*|(?R))*\)')
rx_nested_brackets = re.compile(r'\[(?:[^\[\]]*|(?R))*\]')

for match in rx_part.finditer(string):
    part = rx_nested_brackets.sub('', 
        rx_nested_parentheses.sub('', 
            match.group(1))).strip()
    print(part)

Welches würde ergeben

abc
defg

\(         # opening parenthesis
(?:        # non.capturing group
    [^()]* # not ( nor )
    |      # or
    (?R)   # repeat the pattern
)*
\)
4
Jan 19 Apr. 2018 im 08:45

Ich habe es versucht und ich habe Ihre gewünschte Ausgabe bekommen ... Ich hoffe, ich habe Sie richtig gemacht

import re

with open('aa.txt') as f:
    input = f.read()
    line = input.replace("{","")
    line = line.replace("}","")
    output = re.sub(r'\[.*\]', "", line)
    output = re.sub(r'\(.*\)', "", output)
    print(output)
1
M.H Mighani 19 Apr. 2018 im 08:33