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 . . .


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!


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.


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 .


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

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


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

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.