Comment entrer une expression régulière dans string.replace?


317

J'ai besoin d'aide pour déclarer une expression régulière. Mes entrées sont les suivantes:

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>

La sortie requise est:

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

J'ai essayé ça:

#!/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

J'ai également essayé ceci (mais il semble que j'utilise la mauvaise syntaxe regex):

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

Je ne veux pas coder en dur le replace1 à 99. . .


4
La réponse acceptée couvre déjà votre problème et le résout. As-tu besoin d'autre chose ?
HamZa

Quel devrait être le résultat where the<[99> number ranges from 1-100</[100>?
utapyngo

il devrait également supprimer le numéro dans la <...>balise, donc la sortie devrait êtrewhere the number rangers from 1-100 ?
alvas

Réponses:


566

Cet extrait testé devrait le faire:

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

Edit: Voici une version commentée expliquant comment cela fonctionne:

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)

Les regex sont amusants! Mais je recommanderais fortement de passer une heure ou deux à étudier les bases. Pour commencer, vous devez savoir quels caractères sont spéciaux: les "métacaractères" qui doivent être échappés (c'est-à-dire avec une barre oblique inverse placée devant - et les règles sont différentes à l'intérieur et à l'extérieur des classes de caractères.) Il existe un excellent tutoriel en ligne sur: www .regular-expressions.info . Le temps que vous y passerez sera amorti plusieurs fois. Regexing heureux!


oui ça marche !! merci mais pouvez-vous expliquer le regex en bref?
alvas

9
Ne négligez pas non plus le livre sur les expressions régulières - Maîtriser les expressions régulières , par Jeffrey Friedl
pcurry

Une autre bonne référence voit w3schools.com/python/python_regex.asp
Carson

38

str.replace()fait des remplacements fixes. Utilisez re.sub()plutôt.


3
Il convient également de noter que votre modèle doit ressembler à quelque chose comme "</ {0-1} \ d {1-2}>" ou à toute variante de notation regexp utilisée par python.

3
Que signifient les remplacements fixes?
avi

@avi Il voulait probablement dire un remplacement de mot fixe plutôt qu'un repérage partiel de mot par l'expression régulière.
Gunay Anach

chaînes fixes (littérales, constantes)
vstepaniuk

23

J'irais comme ça (regex expliqué dans les commentaires):

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)

Si vous voulez en savoir plus sur l' expression régulière, je vous recommande de lire le livre de recettes d'expressions régulières de Jan Goyvaerts et Steven Levithan.


2
Vous pouvez simplement utiliser *au lieu de{0,}
HamZa

3
À partir des documents python : {0,}est le même que *, {1,}est équivalent à +et {0,1}est le même que ?. Il vaut mieux l'utiliser *, +ou ?quand vous le pouvez, simplement parce qu'ils sont plus courts et plus faciles à lire.
winklerrr

15

La manière la plus simple

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

Les parenthèses sont-elles vraiment nécessaires? Ce ne serait pas la même regex: <[^>]+>? Soit dit en passant: je pense que votre expression régulière correspondrait trop (par exemple quelque chose comme <html>)
winklerrr


3

ne pas utiliser d'expression régulière (pour votre exemple de chaîne)

>>> 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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.