একটি নিয়মিত এক্সপ্রেশন উপর ভিত্তি করে বিভক্ত স্ট্রিং


143

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

>>> str1="a    b     c      d" # spaces are irregular
>>> str1
'a    b     c      d'
>>> str2=re.split("( )+", str1)
>>> str2
['a', ' ', 'b', ' ', 'c', ' ', 'd'] # 1 space element between!!!

এই কাজ করতে একটি ভাল উপায় আছে কি?

প্রতিটি বিভাজন str2একটি তালিকায় যুক্ত হওয়ার পরে ।


1
আমি এই প্রশ্নটিকে কমিয়ে দিয়েছি। কারণটি হ'ল প্রশ্নটি নিজেই প্রাসঙ্গিক হলেও প্রদত্ত উদাহরণটি সত্যই অনুরোধ করা সমাধানের প্রয়োজন হয় না। যদি আপনার কাছে শব্দের ব্লক, সংখ্যার ব্লক থাকে এবং আপনি এগুলিকে বিভিন্ন ভেরিয়েবলে পৃথক করতে চান তবে একটি রেজেক্স প্রয়োজন হবে।
এরিকবওয়ার্ক

@ এরিকবওয়ার্ক আমি ফলস্বরূপ স্ট্রিংয়ে অযাচিত স্থানের আইটেমটি সরাতে চেয়েছিলাম'str2'
ব্যবহারকারী 2763554

1
হ্যাঁ এবং আপনি কেবল ব্যবহার করে তা অর্জন করতে পারেন str1.split()। একটি রেজেক্সের প্রয়োজন নেই।
এরিকবওয়ার্ক

উত্তর:


176

ব্যবহার করে (, )আপনি গোষ্ঠীটি ক্যাপচার করছেন, যদি আপনি তাদের সরিয়ে ফেলেন তবে আপনার এই সমস্যা হবে না।

>>> str1 = "a    b     c      d"
>>> re.split(" +", str1)
['a', 'b', 'c', 'd']

তবে রেগেক্সের প্রয়োজন নেই, str.splitনির্দিষ্ট কোনও ডিলিমিটার ছাড়াই এটি আপনার জন্য সাদা স্থান দ্বারা বিভক্ত করবে। এটি এই ক্ষেত্রে সেরা উপায় হবে।

>>> str1.split()
['a', 'b', 'c', 'd']

যদি আপনি সত্যিকার অর্থে রেজিक्स চেয়েছিলেন তবে আপনি এটি ব্যবহার করতে পারেন ( '\s'সাদা স্থানের প্রতিনিধিত্ব করে এবং এটি আরও পরিষ্কার):

>>> re.split("\s+", str1)
['a', 'b', 'c', 'd']

অথবা আপনি সমস্ত অ-শ্বেতস্পেস অক্ষর খুঁজে পেতে পারেন

>>> re.findall(r'\S+',str1)
['a', 'b', 'c', 'd']

4
সহজবোধ্য রাখো. str.splitস্পষ্টতই সেরা: ডি
জামিলাক

আমার যদি স্ট্রিং থাকে যা শুরু হয় এবং স্পেস দিয়ে শেষ হয় তবে আমি কীভাবে এটি ব্যবহার করতে পারি। উদাহরণ: 'অ্যাবসি দে'। এর জন্য আউটপুটটি আসবে['', 'a', 'b', 'c', 'de', '']
রাখুলিয়া জেনিশ


@ জামিলাক string.split()একটি বিকল্প। আমি জিজ্ঞাসা করছিলাম এটিও কি রেইগেক্স দিয়ে করা যায়?
রাখোলিয়া জেনিশ

2
@ রাখোলিয়া জেনিশ আপনি কি re.findallবিকল্প ব্যবহার করতে পারবেন না ?
জামিলাক

24

str.splitপদ্ধতি স্বয়ংক্রিয়ভাবে আইটেম মধ্যে সব সাদা স্থান সরাবে:

>>> str1 = "a    b     c      d"
>>> str1.split()
['a', 'b', 'c', 'd']

দস্তাবেজগুলি এখানে রয়েছে: http://docs.python.org/library/stdtyype.html#str.split


1
@ গুরুরাজজয়.এস .: str.split()সম্ভবত হালকা-শুল্ক হিসাবে এটির জন্য সর্বোত্তম পছন্দ।
জোয়েল করনেট

7

আপনি যখন ব্যবহার করেন re.splitএবং বিভক্ত প্যাটার্নে ক্যাপচারিং গ্রুপ থাকে, তখন গ্রুপগুলি আউটপুট ধরে রাখা হয়। আপনি যদি এটি না চান তবে পরিবর্তে একটি ক্যাপচার করার গ্রুপটি ব্যবহার করুন।


2
str.splitআপনার উদাহরণের জন্য সম্ভবত ব্যবহার করা আরও ভাল। আপনি কেবল কেন আপনার আচরণটি পান তা ব্যাখ্যা করতে চেয়েছিলাম।
ব্রেণবার্ন

2

এটি আসলে খুব সহজ। এটা চেষ্টা কর:

str1="a    b     c      d"
splitStr1 = str1.split()
print splitStr1

2
আমি এটি +1 করব তবে আপনি কুৎসিত আধা-কলোন ব্যবহার করছেন।
জামিলাক

3
@ জামিলাক লোল আমি তাদের পরিবর্তন করব। :) জাভা ও অজগর ব্যবহারের অভ্যাস!
নিন্দিত

1
@ GururajY.S। আপনি যদি কেবল স্থানের ভিত্তিতে বিভাজন করতে চান তবে আপনার সহজভাবে ব্যবহার করা উচিতstringToSplit.split()
11:56
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.