पर आधारित सूची तत्वों में स्ट्रिंग स्ट्रिंग मैं एक फ़ंक्शन (पायथन में) बनाने की कोशिश कर रहा हूं जो इसके इनपुट (एक रासायनिक सूत्र) लेता है और एक सूची में विभाजित होता है। उदाहरण के लिए, यदि इनपुट "HC2H3O2" था, यह यह में बदल जाएगा:कीवर्ड
molecule_list = ['H', 1, 'C', 2, 'H', 3, 'O', 2]
यह अब तक अच्छी तरह से काम, लेकिन अगर मैं इनपुट उस में दो पत्र, उदाहरण के लिए सोडियम के साथ एक तत्व (ना) , इसे में इसे विभाजित होगा:
['N', 'a']
मैं एक तरह से मेरी समारोह एक तत्व शब्दकोश बुलाया में पाया चाबी के लिए स्ट्रिंग के माध्यम से बनाने के लिए के लिए खोज कर रहा हूँ। मैं इसके लिए रेगेक्स का उपयोग करने पर भी विचार कर रहा हूं, लेकिन मुझे यकीन नहीं है कि इसे कैसे कार्यान्वित किया जाए। कैसे के बारे में
import re
print re.findall('[A-Z][a-z]?|[0-9]+', 'Na2SO4MnO4')
परिणाम
['Na', '2', 'S', 'O', '4', 'Mn', 'O', '4']
Regex समझाया
def split_molecule(inputted_molecule):
"""Take the input and split it into a list
eg: C02 => ['C', 1, 'O', 2]
"""
# step 1: convert inputted_molecule to a list
# step 2a: if there are two periodic elements next to each other, insert a '1'
# step 2b: if the last element is an element, append a '1'
# step 3: convert all numbers in list to ints
# step 1:
# problem: it splits Na into 'N', 'a'
# it needs to split by periodic elements
molecule_list = list(inputted_molecule)
# because at most, the list can double when "1" is inserted
max_length_of_molecule_list = 2*len(molecule_list)
# step 2a:
for i in range(0, max_length_of_molecule_list):
try:
if (molecule_list[i] in elements) and (molecule_list[i+1] in elements):
molecule_list.insert(i+1, "1")
except IndexError:
break
# step2b:
if (molecule_list[-1] in elements):
molecule_list.append("1")
# step 3:
for i in range(0, len(molecule_list)):
if molecule_list[i].isdigit():
molecule_list[i] = int(molecule_list[i])
return molecule_list
कि बढ़िया है, धन्यवाद! क्या आप रेगेक्स को समझाते हैं? – ohblahitsme
'सीए (एचसीओओ) 2' के बारे में क्या? –
+1 यह उल्लेख करने के लिए कि आपको रीगेक्स पार्सर की बजाय वास्तविक पार्सर की आवश्यकता होगी – aitchnyu