23
23
# "E[rsu]|F[emr]?|G[ade]|H[efgos]?|I[nr]?|Kr?|L[airu]|"
24
24
# "M[dgnot]|N[abdeiop]?|Os?|P[abdmortu]?|R[abefghnu]|"
25
25
# "S[bcegimnr]?|T[abcehilm]|U(u[bhopqst])?|V|W|Xe|Yb?|Z[nr]")
26
- element_ref = pp .Group (element + pp .Opt (pp .Word (digits ), default = "1" ))
26
+ element_ref = pp .Group (element + pp .Optional (pp .Word (digits ), default = "1" ))
27
27
formula = element_ref [...]
28
28
29
29
@@ -33,9 +33,9 @@ def sum_atomic_weights(element_list):
33
33
34
34
formula .run_tests (
35
35
"""\
36
+ NaCl
36
37
H2O
37
38
C6H5OH
38
- NaCl
39
39
""" ,
40
40
full_dump = False ,
41
41
post_parse = lambda _ , tokens : f"Molecular weight: { sum_atomic_weights (tokens )} " ,
@@ -45,7 +45,7 @@ def sum_atomic_weights(element_list):
45
45
46
46
# Version 2 - access parsed items by results name
47
47
element_ref = pp .Group (
48
- element ("symbol" ) + pp .Opt (pp .Word (digits ), default = "1" )("qty" )
48
+ element ("symbol" ) + pp .Optional (pp .Word (digits ), default = "1" )("qty" )
49
49
)
50
50
formula = element_ref [...]
51
51
@@ -56,9 +56,9 @@ def sum_atomic_weights_by_results_name(element_list):
56
56
57
57
formula .run_tests (
58
58
"""\
59
+ NaCl
59
60
H2O
60
61
C6H5OH
61
- NaCl
62
62
""" ,
63
63
full_dump = False ,
64
64
post_parse = lambda _ , tokens :
@@ -69,7 +69,7 @@ def sum_atomic_weights_by_results_name(element_list):
69
69
# Version 3 - convert integers during parsing process
70
70
integer = pp .Word (digits ).set_name ("integer" )
71
71
integer .add_parse_action (lambda t : int (t [0 ]))
72
- element_ref = pp .Group (element ("symbol" ) + pp .Opt (integer , default = 1 )("qty" ))
72
+ element_ref = pp .Group (element ("symbol" ) + pp .Optional (integer , default = 1 )("qty" ))
73
73
formula = element_ref [...].set_name ("chemical_formula" )
74
74
75
75
@@ -79,9 +79,9 @@ def sum_atomic_weights_by_results_name_with_converted_ints(element_list):
79
79
80
80
formula .run_tests (
81
81
"""\
82
+ NaCl
82
83
H2O
83
84
C6H5OH
84
- NaCl
85
85
""" ,
86
86
full_dump = False ,
87
87
post_parse = lambda _ , tokens :
@@ -91,7 +91,7 @@ def sum_atomic_weights_by_results_name_with_converted_ints(element_list):
91
91
92
92
# Version 4 - parse and convert integers as subscript digits
93
93
subscript_digits = "₀₁₂₃₄₅₆₇₈₉"
94
- subscript_int_map = {e [ 1 ]: e [ 0 ] for e in enumerate (subscript_digits )}
94
+ subscript_int_map = {digit : value for value , digit in enumerate (subscript_digits )}
95
95
96
96
97
97
def cvt_subscript_int (s ):
@@ -104,13 +104,20 @@ def cvt_subscript_int(s):
104
104
subscript_int = pp .Word (subscript_digits ).set_name ("subscript" )
105
105
subscript_int .add_parse_action (cvt_subscript_int )
106
106
107
- element_ref = pp .Group (element ("symbol" ) + pp .Opt (subscript_int , default = 1 )("qty" ))
107
+ element_ref = pp .Group (element ("symbol" ) + pp .Optional (subscript_int , default = 1 )("qty" ))
108
108
formula = element_ref [1 , ...].set_name ("chemical_formula" )
109
109
formula .run_tests (
110
110
"""\
111
+ # sodium chloride
112
+ NaCl
113
+ # hydrogen hydroxide
111
114
H₂O
115
+ # phenol
112
116
C₆H₅OH
113
- NaCl
117
+ # ethanol
118
+ C₂H₅OH
119
+ # decanol
120
+ C₁₀H₂₁OH
114
121
""" ,
115
122
full_dump = False ,
116
123
post_parse = lambda _ , tokens :
0 commit comments