J'ai besoin d'aide pour déclarer 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é ceci (mais il semble que j'utilise une syntaxe de regex incorrecte):
line2 = line.replace('<[*> ', '')
line = line2.replace('</[*> ', '')
line2 = line.replace('<[*>', '')
line = line2.replace('</[*>', '')
Je ne veux pas coder la valeur replace
de 1 à 99. . .
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 regexes sont amusants! Mais je vous recommande fortement de passer une heure ou deux à étudier les bases. Pour commencer, vous devez savoir quels caractères sont spéciaux: "métacaractères" qui doivent être échappés (c'est-à-dire avec une barre oblique inversée placée devant - et les règles sont différentes à l'intérieur et à l'extérieur des classes de caractères.) excellent tutoriel en ligne sur: www.larg-expressions.info . Le temps que vous y passerez sera rentabilisé plusieurs fois. Bonne regexing!
str.replace()
effectue des remplacements fixes. Utilisez re.sub()
à la place.
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 regex, je vous recommande de lire Cookbook Expressions Régulier par Jan Goyvaerts et Steven Levithan.
Le moyen le 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
la méthode replace des objets chaîne n'accepte pas les expressions régulières, mais uniquement les chaînes fixes (voir la documentation: http://docs.python.org/2/library/stdtypes.html#str.replace ).
Vous devez utiliser le module re
:
import re
newline= re.sub("<\/?\[[0-9]+>", "", line)
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
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)