Wie gebe ich einen regulären Ausdruck in string.replace ein?

316

Ich brauche Hilfe bei der Deklaration eines regulären Ausdrucks. Meine Eingaben sind wie folgt:

this is a paragraph with<[1> in between</[1> and then there are cases ... where the<[99> number ranges from 1-100</[99>. 
and there are many other lines in the txt files
with<[3> such tags </[3>

Die erforderliche Ausgabe ist:

this is a paragraph with in between and then there are cases ... where the number ranges from 1-100. 
and there are many other lines in the txt files
with such tags

Ich habe das versucht:

#!/usr/bin/python
import os, sys, re, glob
for infile in glob.glob(os.path.join(os.getcwd(), '*.txt')):
    for line in reader: 
        line2 = line.replace('<[1> ', '')
        line = line2.replace('</[1> ', '')
        line2 = line.replace('<[1>', '')
        line = line2.replace('</[1>', '')

        print line

Ich habe dies auch versucht (aber es scheint, als würde ich die falsche Regex-Syntax verwenden):

    line2 = line.replace('<[*> ', '')
    line = line2.replace('</[*> ', '')
    line2 = line.replace('<[*>', '')
    line = line2.replace('</[*>', '')

Ich möchte die replacevon 1 bis 99 nicht hart codieren . . .

Alvas
quelle
4
Die akzeptierte Antwort deckt Ihr Problem bereits ab und löst es. Brauchst du noch was ?
HamZa
Wofür sollte das Ergebnis sein where the<[99> number ranges from 1-100</[100>?
Utapyngo
es sollte auch die Nummer im <...>Tag entfernen , so dass die Ausgabe sein solltewhere the number rangers from 1-100 ?
alvas

Antworten:

562

Dieses getestete Snippet sollte es tun:

import re
line = re.sub(r"</?\[\d+>", "", line)

Bearbeiten: Hier ist eine kommentierte Version, die erklärt, wie es funktioniert:

line = re.sub(r"""
  (?x) # Use free-spacing mode.
  <    # Match a literal '<'
  /?   # Optionally match a '/'
  \[   # Match a literal '['
  \d+  # Match one or more digits
  >    # Match a literal '>'
  """, "", line)

Regexes machen Spaß! Ich würde jedoch dringend empfehlen, ein oder zwei Stunden mit dem Erlernen der Grundlagen zu verbringen. Für den Anfang müssen Sie lernen, welche Zeichen etwas Besonderes sind: "Metazeichen", die maskiert werden müssen (dh mit einem Backslash vorne - und die Regeln sind innerhalb und außerhalb der Zeichenklassen unterschiedlich). Es gibt ein ausgezeichnetes Online-Tutorial unter: www .regular-expression.info . Die Zeit, die Sie dort verbringen, macht sich um ein Vielfaches bezahlt. Viel Spaß beim Regexing!

Ridgerunner
quelle
Ja, es funktioniert !! Danke, aber können Sie den regulären Ausdruck kurz erklären?
Alvas
9
Vernachlässigen Sie auch nicht das Buch über reguläre Ausdrücke - Beherrschung regulärer Ausdrücke , von Jeffrey Friedl
pcurry
Eine weitere gute Referenz ist w3schools.com/python/python_regex.asp
Carson,
38

str.replace()macht feste Ersetzungen. Verwenden Sie re.sub()stattdessen.

Ignacio Vazquez-Abrams
quelle
3
Erwähnenswert ist auch, dass Ihr Muster ungefähr so ​​aussehen sollte wie "</ {0-1} \ d {1-2}>" oder welche Variante der Regexp-Notation Python verwendet.
3
Was bedeutet fester Ersatz?
Avi
@avi Wahrscheinlich meinte er eine feste Wortersetzung, eher eine teilweise Wortfindung durch Regex.
Gunay Anach
feste (wörtliche, konstante) Zeichenfolgen
vstepaniuk
23

Ich würde so vorgehen (Regex in Kommentaren erklärt):

import re

# If you need to use the regex more than once it is suggested to compile it.
pattern = re.compile(r"</{0,}\[\d+>")

# <\/{0,}\[\d+>
# 
# Match the character “<” literally «<»
# Match the character “/” literally «\/{0,}»
#    Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «{0,}»
# Match the character “[” literally «\[»
# Match a single digit 0..9 «\d+»
#    Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
# Match the character “>” literally «>»

subject = """this is a paragraph with<[1> in between</[1> and then there are cases ... where the<[99> number ranges from 1-100</[99>. 
and there are many other lines in the txt files
with<[3> such tags </[3>"""

result = pattern.sub("", subject)

print(result)

Wenn Sie mehr über Regex erfahren möchten, empfehle ich Ihnen, das Regular Expressions Cookbook von Jan Goyvaerts und Steven Levithan zu lesen .

Lorenzo Persichetti
quelle
2
Sie könnten einfach *anstelle von{0,}
HamZa
3
Aus den Python-Dokumenten : {0,}ist dasselbe wie *, {1,}entspricht +und {0,1}ist dasselbe wie ?. Es ist besser , zu verwenden *, +oder ?wenn Sie können, einfach weil sie kürzer und leichter zu lesen.
Winklerrr
15

Der einfachste Weg

import re

txt='this is a paragraph with<[1> in between</[1> and then there are cases ... where the<[99> number ranges from 1-100</[99>.  and there are many other lines in the txt files with<[3> such tags </[3>'

out = re.sub("(<[^>]+>)", '', txt)
print out
Ezequiel Marquez
quelle
Sind die Klammern wirklich notwendig? Wäre das nicht der gleiche reguläre Ausdruck <[^>]+>? Übrigens: Ich denke, Ihre Regex würde zu viel passen (zB so etwas wie <html>)
winklerrr
10

Die Ersetzungsmethode für Zeichenfolgenobjekte akzeptiert keine regulären Ausdrücke, sondern nur feste Zeichenfolgen (siehe Dokumentation: http://docs.python.org/2/library/stdtypes.html#str.replace ).

Sie müssen reModul verwenden:

import re
newline= re.sub("<\/?\[[0-9]+>", "", line)
Zac
quelle
4
Sie sollten \d+anstelle von[0-9]+
winklerrr
3

Sie müssen keinen regulären Ausdruck verwenden (für Ihre Beispielzeichenfolge)

>>> s
'this is a paragraph with<[1> in between</[1> and then there are cases ... where the<[99> number ranges from 1-100</[99>. \nand there are many other lines in the txt files\nwith<[3> such tags </[3>\n'

>>> for w in s.split(">"):
...   if "<" in w:
...      print w.split("<")[0]
...
this is a paragraph with
 in between
 and then there are cases ... where the
 number ranges from 1-100
.
and there are many other lines in the txt files
with
 such tags
kurumi
quelle
3
import os, sys, re, glob

pattern = re.compile(r"\<\[\d\>")
replacementStringMatchesPattern = "<[1>"

for infile in glob.glob(os.path.join(os.getcwd(), '*.txt')):
   for line in reader: 
      retline =  pattern.sub(replacementStringMatchesPattern, "", line)         
      sys.stdout.write(retline)
      print (retline)
Abena Saulka
quelle