String.replace में regex इनपुट कैसे करें?


317

मुझे regex घोषित करने में कुछ मदद चाहिए। मेरे इनपुट निम्न प्रकार हैं:

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>

आवश्यक उत्पादन है:

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

मैंने यह कोशिश की है:

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

मैंने भी यह कोशिश की है (लेकिन ऐसा लगता है कि मैं गलत रेगेक्स सिंटैक्स का उपयोग कर रहा हूं):

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

मैं replace1 से 99 तक हार्ड-कोड नहीं करना चाहता । । ।


4
स्वीकृत उत्तर पहले से ही आपकी समस्या को कवर करता है और इसे हल करता है। क्या आपको और कुछ चाहिये ?
हमजा

इसके लिए क्या परिणाम होना चाहिए where the<[99> number ranges from 1-100</[100>?
utapyngo

यह <...>टैग में नंबर को भी हटा देना चाहिए , इसलिए आउटपुट होना चाहिएwhere the number rangers from 1-100 ?
alvas

जवाबों:


565

यह परीक्षण स्निपेट को करना चाहिए:

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

संपादित करें: यहां बताया गया है कि यह कैसे काम करता है:

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)

रेगेक्स मजेदार हैं! लेकिन मैं दृढ़ता से एक या दो घंटे खर्च करने की सलाह दूँगा। शुरुआत के लिए, आपको यह जानने की जरूरत है कि कौन से वर्ण विशेष हैं: "मेटाचैटरर्स" जो भागने की आवश्यकता है (यानी सामने रखा गया बैकस्लैश - और नियम वर्ण वर्ग के अंदर और बाहर अलग हैं।) इसमें एक उत्कृष्ट ऑनलाइन ट्यूटोरियल है: www। .regular-expressions.info । आपके द्वारा वहाँ बिताया गया समय कई बार अपने लिए चुकाएगा। हैप्पी रेग्गिंग!


हाँ यह काम करता है !! धन्यवाद, लेकिन आप संक्षिप्त में regex समझा सकते हैं?
अल्व्स

9
इसके अलावा पर रेगुलर एक्सप्रेशन उपेक्षा द बुक नहीं - रेगुलर एक्सप्रेशन मास्टरिंग , द्वारा जेफरी फ़्रिड्ल
pcurry

एक और अच्छा संदर्भ w3schools.com/python/python_regex.asp
कार्सन

38

str.replace()निश्चित प्रतिस्थापन करता है। re.sub()इसके बजाय उपयोग करें ।


3
यह भी ध्यान देने योग्य है कि आपके पैटर्न को "</ {0-1} \ d {1-2}>" या regexp संकेतन पायथन के किसी भी प्रकार का उपयोग करना चाहिए।

3
नियत प्रतिस्थापन का क्या अर्थ है?
avi

@avi संभवत: उनका अर्थ था रेगेक्स के माध्यम से पता लगाने के बजाय आंशिक शब्द नियत शब्द।
गुनाय आँच

निश्चित (शाब्दिक, स्थिर) तार
vstepaniuk

23

मैं इस तरह से जाऊंगा (टिप्पणियों में समझाया रेगेक्स):

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)

यदि आप रेगेक्स I के बारे में अधिक जानना चाहते हैं तो मैं जन गोयर्वाट्स और स्टीवन लेवेशन द्वारा रेगुलर एक्सप्रेशंस कुकबुक पढ़ने के लिए पुन: दावा करता हूं।


2
आप *इसके बजाय{0,}
HamZa

3
से अजगर डॉक्स : {0,}रूप में ही है *, {1,}के बराबर है +, और{0,1} के रूप में ही है ?। यह उपयोग करने के लिए बेहतर है *, +या ?जब आप कर सकते हैं, बस क्योंकि वे छोटी और पढ़ने में आसान कर रहे हैं।
विंकलेरर

15

सबसे आसान तरीका

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

क्या कोष्ठक वास्तव में आवश्यक हैं? कि एक ही regex नहीं होगा <[^>]+>:? वैसे: मुझे लगता है कि आपका रेगेक्स बहुत अधिक मेल खाता होगा (जैसे कुछ <html>)
winklerrr

10

स्ट्रिंग ऑब्जेक्ट्स की विधि नियमित अभिव्यक्तियों को स्वीकार नहीं करती है लेकिन केवल निश्चित स्ट्रिंग्स (प्रलेखन देखें: http://docs.python.org/2/library/stdtypes.html#str.replace) )।

आपको reमॉड्यूल का उपयोग करना होगा :

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

4
आपको \d+इसके बजाय का उपयोग करना चाहिए[0-9]+
winklerrr

3

नियमित अभिव्यक्ति का उपयोग करने की आवश्यकता नहीं है (अपने नमूना स्ट्रिंग के लिए)

>>> 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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.