স্ট্রিং.রেপ্লেসে কোনও রেজেক্স কীভাবে ইনপুট করবেন?


316

রেজেক্স ঘোষণার জন্য আমার কিছু সহায়তা দরকার। আমার ইনপুটগুলি নিম্নলিখিতগুলির মতো:

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>?
উতপাইঙ্গো

এটি <...>ট্যাগের where the number rangers from 1-100 ?
নম্বরটিও

উত্তর:


564

এই পরীক্ষিত স্নিপেটটি এটি করা উচিত:

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)

রেজেক্সস মজা! তবে আমি বেসিকগুলি অধ্যয়ন করার জন্য এক বা দুই ঘন্টা ব্যয় করার জন্য দৃ strongly়ভাবে সুপারিশ করব। প্রারম্ভিকদের জন্য, আপনার কোন অক্ষরগুলি বিশেষ তা শিখতে হবে: "মেটাচ্যাকার্টর" যা এড়ানো দরকার (যেমন সামনে রাখা একটি ব্যাকস্ল্যাশ সহ - এবং নিয়মগুলি অক্ষরের ভিতরে এবং বাইরে আলাদা classes) এখানে একটি দুর্দান্ত অনলাইন টিউটোরিয়াল রয়েছে: www .regular-expressions.info । আপনি সেখানে সময় ব্যয় নিজের জন্য অনেক বার দিতে হবে। হ্যাপি রেজেক্সিং!


হ্যাঁ এটা কাজ করে !! ধন্যবাদ তবে আপনি কি সংক্ষেপে রেজেক্সকে ব্যাখ্যা করতে পারবেন?
আলভাস

9
এছাড়াও রেগুলার এক্সপ্রেশন অবহেলা কিতাব না - রেগুলার এক্সপ্রেশন নিয়ন্ত্রণ দ্বারা জেফ্রি Friedl
pcurry

আরেকটি ভাল রেফারেন্স w3schools.com/python/python_regex.asp
কারসন

38

str.replace()স্থির প্রতিস্থাপন করে। re.sub()পরিবর্তে ব্যবহার করুন।


3
আপনার প্যাটার্নটি "</ {0-1} \ d {1-2}>" বা রিজেএক্সএক্স নোটেশনের পাইথনের যে কোনও রূপই ব্যবহার করে look

3
স্থির প্রতিস্থাপনের অর্থ কী?
এভিআই

@ আভি সম্ভবত তার অর্থ রেগেক্সের মাধ্যমে স্থির শব্দ প্রতিস্থাপনের চেয়ে আংশিক শব্দ সনাক্তকরণ।
গুণে আনাচ

স্থির (আক্ষরিক, ধ্রুবক) স্ট্রিংগুলি
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)

আপনি যদি রেইজেক্স সম্পর্কে আরও জানতে চান তবে আমি জ্যান গোয়েভার্টস এবং স্টিভেন লেভিথনের নিয়মিত এক্সপ্রেশন কুকবুকটি পড়তে ফিরে পেলাম।


2
আপনি সহজেই এর *পরিবর্তে ব্যবহার করতে পারেন{0,}
হামজা

3
থেকে পাইথন ডক্স : {0,}হিসাবে একই *, {1,}সমতূল্য +, এবং {0,1}হিসাবে একই ?। এটা ব্যবহার করা ভালো *, +অথবা ?যখন আপনি করতে পারেন, সহজভাবে কারণ তারা খাটো অথবা পড়ার জন্য সহজ আছেন।
উইঙ্কলারr

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>)
উইঙ্কলারের

10

স্ট্রিং অবজেক্টগুলির প্রতিস্থাপনের পদ্ধতিটি নিয়মিত এক্সপ্রেশনগুলি গ্রহণ করে না কেবল কেবল স্ট্রিং স্ট্রিংগুলি (ডকুমেন্টেশন দেখুন: http://docs.python.org/2/library/stdtypes.html#str.re جگہ )।

আপনাকে reমডিউল ব্যবহার করতে হবে :

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

4
আপনার \d+পরিবর্তে ব্যবহার করা উচিত[0-9]+
উইঙ্কলারের 14

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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.