Bagaimana cara memasukkan regex di string.replace?

317

Saya butuh bantuan untuk mendeklarasikan regex. Input saya seperti berikut:

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>

Output yang dibutuhkan adalah:

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

Saya sudah mencoba ini:

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

Saya juga sudah mencoba ini (tapi sepertinya saya menggunakan sintaks regex yang salah):

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

Saya tidak ingin hard-code replacedari 1 hingga 99. . .

alva
sumber
4
Jawaban yang diterima sudah mencakup masalah Anda dan menyelesaikannya. Apakah Anda memerlukan yang lain?
HamZa
Untuk apa hasilnya where the<[99> number ranges from 1-100</[100>?
utapyngo
itu juga harus menghapus nomor dalam <...>tag, sehingga hasilnya haruswhere the number rangers from 1-100 ?
alvas

Jawaban:

566

Cuplikan yang diuji ini harus melakukannya:

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

Sunting: Ini versi komentar yang menjelaskan cara kerjanya:

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)

Regex itu menyenangkan! Tetapi saya sangat merekomendasikan menghabiskan satu atau dua jam mempelajari dasar-dasar. Sebagai permulaan, Anda perlu mempelajari karakter mana yang spesial: "metacharacters" yang perlu melarikan diri (yaitu dengan backslash ditempatkan di depan - dan aturannya berbeda di dalam dan di luar kelas karakter.) Ada tutorial online yang sangat baik di: www . regular-expressions.info . Waktu yang Anda habiskan di sana akan membayar sendiri berkali-kali lipat. Selamat regexing!

penunggang kuda
sumber
ya berhasil !! terima kasih tetapi bisakah Anda menjelaskan regex secara singkat?
alvas
9
Juga jangan abaikan Buku tentang Ekspresi Reguler - Menguasai Ekspresi Reguler , oleh Jeffrey Friedl
pcurry
Referensi bagus lainnya adalah w3schools.com/python/python_regex.asp
Carson
38

str.replace()melakukan penggantian tetap. Gunakan re.sub()sebagai gantinya.

Ignacio Vazquez-Abrams
sumber
3
Juga perlu dicatat bahwa pola Anda akan terlihat seperti "</ {0-1} \ d {1-2}>" atau varian apa pun yang digunakan python notasi regexp.
3
Apa yang dimaksud dengan penggantian tetap?
avi
@avi Mungkin maksudnya penggantian kata tetap mencari kata sebagian melalui regex.
Gunay Anach
string tetap (literal, konstan)
vstepaniuk
23

Saya akan seperti ini (regex dijelaskan dalam komentar):

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)

Jika Anda ingin mempelajari lebih lanjut tentang regex, saya sarankan untuk membaca Cookbook Ekspresi Reguler oleh Jan Goyvaerts dan Steven Levithan.

Lorenzo Persichetti
sumber
2
Anda bisa menggunakan *saja{0,}
HamZa
3
Dari python docs : {0,}sama dengan *, {1,}sama dengan +, dan {0,1}sama dengan ?. Lebih baik digunakan *,, +atau ?ketika Anda bisa, hanya karena lebih pendek dan lebih mudah dibaca.
winklerrr
15

Cara termudah

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
sumber
Apakah tanda kurung benar-benar diperlukan? Bukankah itu menjadi regex yang sama: <[^>]+>? Ngomong-ngomong: Saya pikir regex Anda akan cocok terlalu banyak (misalnya sesuatu seperti <html>)
winklerrr
10

ganti metode objek string tidak menerima ekspresi reguler tetapi hanya string tetap (lihat dokumentasi: http://docs.python.org/2/library/stdtypes.html#str.replace ).

Anda harus menggunakan remodul:

import re
newline= re.sub("<\/?\[[0-9]+>", "", line)
Zac
sumber
4
Anda harus menggunakan \d+sebagai gantinya[0-9]+
winklerrr
3

tidak harus menggunakan ekspresi reguler (untuk string sampel Anda)

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