স্ট্রিংয়ের বাম অংশটি কীভাবে সরিয়ে ফেলবেন?


144

আমি কিছু সহজ পাইথন কোড যা একটি স্ট্রিং যেমন এর জন্য অনুসন্ধান ফাইল আছে path=c:\path, যেখানে c:\pathঅংশ পরিবর্তিত হতে পারে। বর্তমান কোডটি হ'ল:

def find_path(i_file):
    lines = open(i_file).readlines()
    for line in lines:
        if line.startswith("Path="):
            return # what to do here in order to get line content after "Path=" ?

এর পরে পাঠ্যটি পাওয়ার সহজ উপায় কী Path=?


সচেতন হন যে আপনি "পথ =" দিয়ে শুরু হওয়া ফাইলটির মধ্যে প্রথম লাইনের উপস্থিতিতে ফিরে আসছেন। এই পোস্টের অন্যান্য উত্তরগুলিও করে। তবে ফাইলটি যদি ডস ব্যাচের ফাইলের মতো কিছু হয় তবে আপনি "ব্যাচ" বা কমান্ড ফাইলটি শর্তাবলীতে ভরাট না করে যদি আপনি নির্ভর করে তবে এই জাতীয় ফাইলটি থেকে শেষ পংক্তির প্রকৃতপক্ষে উপস্থিত থাকতে পারেন।
দেবপ্লেয়ার

উত্তর:


22

শুরু করে Python 3.9, আপনি ব্যবহার করতে পারেন removeprefix:

'Path=helloworld'.removeprefix('Path=')
# 'helloworld'

4
সময় ভ্রমণ অনেক বেশি? ;-) থেকে PEP 596 - পাইথন 3.9 রিলিজ সূচি : 3.9.0 চূড়ান্ত: সোমবার, 2020-10-05
এসএসসি

আমি পাইথন ৩.৯-এর জন্য সমাধানটি লিখতে যাচ্ছিলাম তবে মনে হয় আপনি সর্বত্র অজগর ৩.৯ টি সমাধান উল্লেখ করেছেন। :)
পিগর্ল

196

স্ট্রিং স্থির হয়ে থাকলে আপনি কেবল ব্যবহার করতে পারেন:

if line.startswith("Path="):
    return line[5:]

যা আপনাকে স্ট্রিংয়ের 5 পজিশন থেকে সমস্ত কিছু দেয় (একটি স্ট্রিংও একটি ক্রম তাই এই সিকোয়েন্স অপারেটরগুলি এখানেও কাজ করে)।

অথবা আপনি প্রথমে লাইনটি বিভক্ত করতে পারেন =:

if "=" in line:
    param, value = line.split("=",1)

তারপরে পরম হ'ল "পথ" এবং মানটি প্রথম = পরে বাকী।


3
বিভাজন পদ্ধতির জন্য +1, লেনের (উপসর্গ) উপর ম্যানুয়াল স্লাইসিংয়ের সামান্য কদর্যতা এড়ানো।
ববিনস

1
তবে আপনার ইনপুটটি "কিছু = কিছু কিছু" আকারে না থাকলেও ছোঁড়ে।
ড্যান অলসন

1
সে কারণেই আমি শর্তটি সামনে রেখেছি তাই যদি "=" স্ট্রিং থাকে তবে এটি ব্যবহৃত হয়। অন্যথায় আপনি বিভাজনের ফলাফলের দৈর্ঘ্য () এবং এটি = = 2 হলে পরীক্ষা করতে পারেন।
মিস্টারটফ

7
ড্যান অলসনের মতই ডেলিমেটার splitউপস্থিত না থাকলে একটি ব্যতিক্রম ছুঁড়ে ফেলে। partitionআরও স্থিতিশীল, এটি একটি স্ট্রিংও বিভক্ত হয় এবং সর্বদা প্রাক, ডিলিমিটার এবং পোস্ট-কন্টেন্টের সাথে একটি ত্রি-উপাদানগুলির টুপল ফেরত দেয় (যার মধ্যে কিছু কিছু ''যদি ডিলিমিটারটি উপস্থিত না থাকে তবে)। যেমন value = line.partition('='),।
অ্যান্ডারস জোহানসন

1
সীমানা উপস্থিত না থাকলে স্প্লিট একটি ব্যতিক্রম ছুঁড়ে না, এটি পুরো স্ট্রিং সহ একটি তালিকা দেয়। কমপক্ষে
ম্যাক্সিম

122

একটি স্ট্রিং থেকে উপসর্গ সরান

# ...
if line.startswith(prefix):
   return line[len(prefix):]

এর মাধ্যমে বিভাজকের প্রথম ঘটনায় বিভক্ত করুন str.partition()

def findvar(filename, varname="Path", sep="=") :
    for line in open(filename):
        if line.startswith(varname + sep):
           head, sep_, tail = line.partition(sep) # instead of `str.split()`
           assert head == varname
           assert sep_ == sep
           return tail

কনফিগার পার্সারের সাথে আইএনআই-এর মতো ফাইল পার্স করুন

from ConfigParser import SafeConfigParser
config = SafeConfigParser()
config.read(filename) # requires section headers to be present

path = config.get(section, 'path', raw=1) # case-insensitive, no interpolation

অন্যান্য অপশন


1
চারটির পরিবর্তে তিনটি স্পেস যুক্ত করার বিরল কারণ।
বব স্টেইন

25
def remove_prefix(text, prefix):
    return text[len(prefix):] if text.startswith(prefix) else text

1
আমি এটি পছন্দ করি কারণ আপনি "অন্য পাঠ্য" এর সাথে "অন্যথায় মিথ্যা" বা "অন্য কোনও নয়" বা যা-যা-টাইপ- প্রতিস্থাপন করতে পারেন - আপনি ফাইলটিতে যে লাইনটি "পথ =" দিয়ে শুরু হয়নি তা বোঝাতে ফিরে যেতে চান। ব্যক্তিগতভাবে আমি আমার টেরিনারি অপারেটরগুলিকে দৃষ্টিভঙ্গি করে দাঁড়াতে বন্ধনীগুলি দিয়ে ঘিরে রাখতে চাই।
দেবপ্লেয়ার

19

সাধারণভাবে স্লাইসিং (শর্তসাপেক্ষ বা অ-শর্তসাপেক্ষ) জন্য আমি একজন সহকর্মী সম্প্রতি প্রস্তাবিত পরামর্শটি পছন্দ করি; একটি খালি স্ট্রিং সহ প্রতিস্থাপন ব্যবহার করুন। কোডটি পড়া সহজ, কম কোড (কখনও কখনও) এবং অক্ষরের ভুল সংখ্যা উল্লেখ করার ঝুঁকি কম। ঠিক আছে; আমি পাইথন ব্যবহার করি না, তবে অন্যান্য ভাষায় আমি এই পদ্ধতির পছন্দ করি না:

rightmost = full_path.replace('Path=', '', 1)

অথবা - এই পোস্টে প্রথম মন্তব্য পর্যন্ত অনুসরণ করতে - এই শুধুমাত্র সম্পন্ন করতে হবে যদি যদি লাইন শুরু সঙ্গে Path:

rightmost = re.compile('^Path=').sub('', full_path)

উপরে কিছু পরামর্শ দেওয়া হয়েছে তার মূল পার্থক্যটি হ'ল কোনও "ম্যাজিক নম্বর" (5) জড়িত নেই, বা উভয়ই ' 5' এবং স্ট্রিং ' Path=' নির্দিষ্ট করার প্রয়োজন নেই , অন্য কথায় আমি একটি কোড রক্ষণাবেক্ষণ থেকে এই পদ্ধতির পছন্দ করি দৃষ্টিকোণ


এটি কাজ করে না: 'সি = পথ = এ'রপ্লেস ("পথ =", "", ১) ->' সি = এ '।
jfs

3
যা "পথ =" দিয়ে শুরু করে স্ট্রিংয়ের মূল প্রয়োজনীয়তা পূরণ করে না।
কুকুরছানা

1
আপনি ন্যায়সঙ্গত কোড দ্বারা প্রতিস্থাপন করতে পারেন rightmost = re.sub('^Path=', '', fullPath)compile()পদ্ধতির উদ্দেশ্য হ'ল আপনি কম্পাইল করা অবজেক্টটি পুনরায় ব্যবহার করলে জিনিসগুলি দ্রুত করা, তবে যেহেতু আপনি এটি ব্যবহারের পরে এটিকে ফেলে দেন, তাই এখানে এটির কোনও প্রভাব নেই। যাইহোক যাইহোক এই অপটিমাইজেশনটি সম্পর্কে উদ্বিগ্ন হওয়ার মতো নয়।
জিম ওল্ডফিল্ড

13

আমি popইনডেক্সিং পছন্দ করি [-1]:

value = line.split("Path=", 1).pop()

প্রতি

value = line.split("Path=", 1)[1]
param, value = line.split("Path=", 1)

2
"ম্যাজিক নম্বর" ছাড়াই দুর্দান্ত বিকল্প। এটি লক্ষণীয় যে এটি কাজ করে কারণ startswithইতিমধ্যে পরীক্ষা করা হয়েছে সুতরাং এর splitআগে "কিছুই নয়" এবং সমস্ত কিছু ভাগ করে দেওয়া হবে। split("Path=", 1)আরও সুনির্দিষ্ট (পরের স্ট্রিংয়ের পরে প্রিফিক্স পুনরায় প্রদর্শিত হওয়ার ক্ষেত্রে) তবে একটি ম্যাজিক নম্বর পুনরায় পরিচয় করে।
কোরনিয়ান

1
পূর্ববর্তী মন্তব্যের সংক্ষিপ্ত সংস্করণ: আপনি প্রথমে শুরুর সাথে (যদি) পরীক্ষা করেন তবে এটি কেবলমাত্র কাজ করে।
মার্চ


5

কেমন..

>>> line = r'path=c:\path'
>>> line.partition('path=')
('', 'path=', 'c:\\path')

এই ট্রিপলেটটি হ'ল মাথা, বিভাজক এবং লেজ


এটি সব ক্ষেত্রে একইভাবে কাজ করে না। বিভাজক উপস্থিত থাকলে ফলাফলটি তৃতীয় আইটেম। অন্যথায়, ফলাফলটি প্রথম আইটেম।
আইওনিস ফিলিপিসিস

5

সবচেয়ে সহজ উপায় আমি ভাবার সাথে চিন্তা করতে পারি:

def find_path(i_file): 
    lines = open(i_file).readlines() 
    for line in lines: 
        if line.startswith("Path=") : 
            return line[5:]

স্লাইস নোটেশনের একটি দ্রুত নোট, এটি স্বাভাবিকের পরিবর্তে দুটি সূচক ব্যবহার করে। প্রথম সূচীটি স্লাইজে আপনি যে ক্রমটি অন্তর্ভুক্ত করতে চান তার প্রথম উপাদানটি নির্দেশ করে এবং শেষ সূচকটি সূচিটি হ'ল শেষ উপাদানটির সাথে সাথে স্লাইসে অন্তর্ভুক্ত করতে চান।
উদাহরণ:

sequence_obj[first_index:last_index]

স্লাইস এর মধ্যে first_indexএবং এর সাথে সমস্ত উপাদান last_indexরয়েছে first_indexএবং নাও রয়েছে last_index। যদি প্রথম সূচক বাদ দেওয়া হয় তবে এটি ক্রমের শুরুতে ডিফল্ট হয়। যদি শেষ সূচকটি বাদ দেওয়া হয় তবে এটি ক্রমের শেষ উপাদান পর্যন্ত সমস্ত উপাদানকে অন্তর্ভুক্ত করে। নেতিবাচক সূচকগুলিও অনুমোদিত। বিষয়টি সম্পর্কে আরও জানতে গুগল ব্যবহার করুন।


4
>>> import re

>>> p = re.compile(r'path=(.*)', re.IGNORECASE)

>>> path = "path=c:\path"

>>> re.match(p, path).group(1)
'c:\\path'

1. r''উইন্ডোজ পাথের জন্য স্ট্রিং ব্যবহার করুন । 2. re.match()
কোনওটিই

3

এখানে অন্য একটি সাধারণ লাইনার উল্লেখ করা হয়নি:

value = line.split("Path=", 1)[-1]

এটি বিভিন্ন প্রান্তের ক্ষেত্রেও সঠিকভাবে কাজ করবে:

>>> print("prefixfoobar".split("foo", 1)[-1])
"bar"

>>> print("foofoobar".split("foo", 1)[-1])
"foobar"

>>> print("foobar".split("foo", 1)[-1])
"bar"

>>> print("bar".split("foo", 1)[-1])
"bar"

>>> print("".split("foo", 1)[-1])
""



1

আপনি যদি তালিকার বোধগম্যতা জানেন:

lines = [line[5:] for line in file.readlines() if line[:5] == "Path="]

একটি সম্পাদনার পরামর্শ দেওয়া হয়েছিল line.startswith(...) যা 10 এক্স দ্রুততর বলে । আমার পরীক্ষাটি এটি নিশ্চিত করে নি। যদি প্রমাণ দেওয়া হয় যে প্রমাণ সরবরাহ করা হয় তবে এটি পরিবর্তন করে খুশি।
ম্যাথু শিনকেল 9:34

0

পপ সংস্করণটি ঠিক ছিল না। আমি মনে করি আপনি চান:

>>> print('foofoobar'.split('foo', 1).pop())
foobar

0

কেন পালাবার সাথে রেজেক্স ব্যবহার করছেন না? ^একটি লাইনের প্রাথমিক অংশের সাথে re.MULTILINEমেলে এবং প্রতিটি লাইনের সাথে মেলে। re.escapeমিলটি হুবহু নিশ্চিত করে।

>>> print(re.sub('^' + re.escape('path='), repl='', string='path=c:\path\nd:\path2', flags=re.MULTILINE))
c:\path
d:\path2

0

নিম্নলিখিত অনুসরণ করার চেষ্টা করুন

if line.startswith("Path="): return line[5:]

1
আপনার উত্তর এবং গৃহীত উত্তরটির মধ্যে পার্থক্য কী? আমি দেখতে পাচ্ছি যে এটি অন্য উত্তরের প্রথম অংশে রয়েছে।
eyllanesc

-1

আপনি ঠিক যা খুঁজছেন তা আমি অনুমান করি

    def findPath(i_file) :
        lines = open( i_file ).readlines()
        for line in lines :
            if line.startswith( "Path=" ):
                output_line=line[(line.find("Path=")+len("Path=")):]
                return output_line

-1

কোনও ফাংশন লেখার ছাড়াই এটি তালিকা অনুসারে বিভক্ত হবে, এই ক্ষেত্রে 'মিঃ | ড। ড। মিসেস।', [1] এর সাথে বিভক্ত হওয়ার পরে সমস্ত কিছু নির্বাচন করুন, তারপরে আবার বিভাজন করুন এবং যে কোনও উপাদানটি ধরুন। নীচের ক্ষেত্রে, 'মরিস' ফিরিয়ে দেওয়া হয়েছে।

re.split('Mr.|Dr.|Mrs.', 'Mr. Morgan Morris')[1].split()[1]

-1

এটি অন্যান্য উত্তরের মতো কৌশলটিতে খুব একই রকম, তবে কোনও পুনরাবৃত্ত স্ট্রিং অপারেশন না থাকলে, উপসর্গটি ছিল কিনা তা জানার ক্ষমতা এবং এখনও যথেষ্ট পাঠযোগ্য:

parts = the_string.split(prefix_to_remove, 1):
    if len(parts) == 2:
        #  do things with parts[1]
        pass
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.