我试图在我的“化学计算器”项目中找到一种分隔字符串的方法。该项目从 input()中获取字符串,并在列表中进行比较:
substance1 = input('Substance 1: ')
substance2 = input('Substance 2: ')
elements = ['f','o','cl','br','i','s','c']
def affinity_table(element1:str,element2:str,table:list) -> str:
s = element1.lower()
r = element2.lower()
if s in table and r in table:
if table.index(s) < table.index(r):
print(s," will chage with ", r)
else:
print(s," won't change with ", r)
else:
print("Those substances are't in the list")
上面的代码效果很好。
所以我想让它用于孔物质而不只是元素。为此,我需要将物质分成几部分:
然后我需要将它们与列表进行比较。我注意到 contains()函数完全显示了我想要的内容,但是只有一个比较。
我的问题来自: 有没有一种方法可以将 contains()函数与多个字符串一起使用,然后将该字符串分隔到发现相似之处。
类似的东西:
a = 'NaCO3' #First input.
b = 'KCO3' #Second input.
list = ['Na','K'] #The list.
# Way of separating the values with the list.
# ^ my objective.
a1 = 'Na' #Separation with a.
a2 = 'CO3' #The rest of a.
b1 = 'K' #The rest of b.
b2 = 'CO3' #The rest of b.
# ^ expected outputs from the separation.
if table.index(a1) < table.index(a2):
print(a1,' will change with ', b1, 'and become', a1 + b2)
else:
print(a1," won't change with ", b1, 'and will stay normal')
# ^ the list index comparison from the 1st code.
答案 0 :(得分:2)
免责声明
请明确说明:对于您正在执行的操作的受限范围,此解决方案可能适用。如果要解析任何化合物(看起来很复杂),则需要完整的解析器,而不是我想出的玩具正则表达式解决方案。
这是一个主意:
使用列表中的元素作为交替匹配组动态构建正则表达式。 (re.split
在拆分时保留组。)
>>> import re
>>> lst = ['Na', 'K']
>>> regex = '|'.join('({})'.format(a) for a in lst)
>>> regex
>>> '(Na)|(K)'
应用正则表达式...
>>> re.split(regex, 'NaCO3')
>>> ['', 'Na', None, 'CO3']
>>> re.split(regex, 'KCO3')
>>> ['', None, 'K', 'CO3']
...并过滤出虚假值(None
,''
)
>>> list(filter(None, re.split(regex, 'NaCO3')))
>>> ['Na', 'CO3']
>>> list(filter(None, re.split(regex, 'KCO3')))
>>> ['K', 'CO3']
您可以通过扩展的可迭代拆包将其分配给这些值:
>>> b1, b2, *unexpected_rest = filter(None, re.split(regex, 'KCO3'))
>>> b1
>>> 'K'
>>> b2
>>> 'CO3'
如果您想使拆分偏向于更长的匹配,请首先以降序对lst
进行排序。
不好:
>>> lst = ['N', 'Na', 'CO3']
>>> regex = '|'.join('({})'.format(a) for a in lst)
>>> list(filter(None, re.split(regex, 'NaCO3')))
>>> ['N', 'a', 'CO3']
更好:
>>> lst = ['N', 'Na', 'CO3']
>>> lst = sorted(lst, key=len, reverse=True)
>>> regex = '|'.join('({})'.format(a) for a in lst)
>>> list(filter(None, re.split(regex, 'NaCO3')))
>>> ['Na', 'CO3']
让我知道这是否对您有用。