411 votes

La saisie d'une expression régulière dans une chaîne.remplacer en python?

J'ai besoin d'aide sur la déclaration d'une regex. Mes entrées sont comme suit:

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é ceci:

#!/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 aussi essayé (mais il me semble que je suis en utilisant la mauvaise syntaxe regex):

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

Je ne veux pas coder en dur l' replace de 1 à 99 . . .

706voto

ridgerunner Points 14773

Cette testés extrait devrait le faire:

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

Edit: Voici une version commentée en expliquant comment elle 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)

Regexes sont fun! Mais je vous recommande fortement de passer une heure ou deux d'étudier les notions de base. Pour commencer, vous devez savoir quels sont les caractères spéciaux: "caractères" qui doivent être échappés (c'est à dire avec une barre oblique inverse mis en avant et les règles sont différentes à l'intérieur et à l'extérieur des classes de caractères.) Il y a un excellent tutoriel en ligne à: www.regular-expressions.info. Le temps que vous passez, il va payer pour lui-même à plusieurs reprises. Heureux regexing!

47voto

str.replace() n'des remplacements fixes. Utiliser re.sub() à la place.

27voto

Boydon Points 202

Je voudrais aller 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 les regex je vous conseille de lire les Expressions Régulières livre de cuisine par Jan Goyvaerts et Steven Levithan.

15voto

Ezequiel Marquez Points 650

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

11voto

Zac Points 427

remplacement de la méthode de chaîne objets n'accepte pas les expressions régulières, mais seulement les chaînes fixes (voir la documentation: http://docs.python.org/2/library/stdtypes.html#str.replace).

Vous devez utiliser re module de:

import re
newline= re.sub("<\/?\[[0-9]+>", "", line)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X