用列表分隔字符串

时间:2018-11-11 16:00:50

标签: python python-3.x

我试图在我的“化学计算器”项目中找到一种分隔字符串的方法。该项目从 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.

#解决方案之后,结果如下:  The Results

1 个答案:

答案 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']

让我知道这是否对您有用。