String.replace içine normal ifade nasıl girilir?


317

Normal ifade beyanında yardıma ihtiyacım var. Girişlerim aşağıdaki gibidir:

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>

Gerekli çıktı:

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

Bunu denedim:

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

Ben de denedim (ama yanlış regex sözdizimi kullanıyorum gibi görünüyor):

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

replace1'den 99'a kadar sabit kodlamak istemiyorum . . .


4
Kabul edilen cevap zaten probleminizi kapsar ve çözer. Başka bir şeye ihtiyacın var mı ?
HamZa

Sonuç ne olmalı where the<[99> number ranges from 1-100</[100>?
utapyngo

ayrıca <...>etiketteki sayıyı da kaldırmalıdır , bu nedenle çıktı şu şekilde olmalıdırwhere the number rangers from 1-100 ?
alvas

Yanıtlar:


565

Bu test edilmiş snippet şunları yapmalıdır:

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

Düzenleme: İşte nasıl çalıştığını açıklayan yorumlanmış bir sürüm:

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 eğlenceli! Ama temelleri incelemek için bir iki saat harcamanızı şiddetle tavsiye ederim. Yeni başlayanlar için hangi karakterlerin özel olduğunu öğrenmelisiniz: kaçması gereken "metakarakterler" (örneğin, ters eğik çizgi yerleştirilmiş olarak - ve kurallar iç ve dış karakter sınıfları farklıdır.) Mükemmel bir çevrimiçi öğretici var: www : .regular-expressions.info . Orada geçirdiğiniz süre, birçok kez kendisi için ödeme yapar. Mutlu regexing!


evet çalışıyor !! teşekkürler ama kısaca normal ifadeyi açıklayabilir misiniz?
alvas

9
Ayrıca Düzenli İfadeler Kitabı'nı da ihmal etmeyin - Düzenli İfadelere
hakim olma


38

str.replace()sabit değiştirmeler yapar. re.sub()Bunun yerine kullanın .


3
Ayrıca, deseninizin "</ {0-1} \ d {1-2}>" veya regexp notasyonu python'un kullandığı herhangi bir varyant gibi görünmesi gerektiğini de belirtmek gerekir.

3
Sabit yedek parçaların anlamı nedir?
avi

@avi Muhtemelen regex aracılığıyla yerini kısmi kelime yerine sabit kelime değiştirme demekti.
Gunay Anach

sabit (değişmez, sabit) dizeler
vstepaniuk

23

Ben böyle giderdim (regex yorumlarda açıkladı):

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)

Normal ifade hakkında daha fazla bilgi edinmek isterseniz, Jan Goyvaerts ve Steven Levithan'ın Düzenli İfadeler Yemek Kitabı'nı okumanızı tavsiye ederim .


2
Bunun *yerine sadece kullanabilirsiniz{0,}
HamZa

3
Gönderen piton docs : {0,}aynıdır *, {1,}eşittir +ve {0,1}aynıdır ?. Daha kısa ve daha kolay okunabildikleri için *, kullanmak +veya mümkün ?olduğunda kullanmak daha iyidir .
winklerrr

15

En kolay yol

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

Parantez gerçekten gerekli mi? Aynı normal ifade olmaz mıydı <[^>]+>? Bu arada: Bence senin regex çok eşleşecek (örneğin bir şey gibi <html>)
winklerrr


3

normal ifadeyi kullanmak zorunda değilsiniz (örnek dizeniz için)

>>> 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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.