【问题标题】:Python split string by multiple specific characters and keep the "delimiters"Python由多个特定字符拆分字符串并保留“分隔符”
【发布时间】:2020-06-10 05:12:56
【问题描述】:

我有一个这样的化合物列表:

ex = ['CrO3', 'Cr8O21', 'NbCrO4']

我想分别获取元素和数字。像这样的:

['Cr','O',3]

['Cr',8,'O',21]

['Nb','Cr','O',4]

但是,这必须是一个通用过程 - 这些并不总是我正在使用的化合物。 我认为这可以使用正则表达式和 split() 函数来完成。但是,我很难找到正确的正则表达式来得到我想要的。

这是我现在拥有的:

# elements to split by
split_elements = ['Cr','Nb','O']

def split(compound, split_elements):
    separated = []
    splitstr = ")|(?=".join([str(elem) for elem in split_elements]) 
    splitstr = '('+splitstr+')'
    # splitstr will end up like this: 
    # (Cr)|(?=Nb)|(?=O)

    result = list(filter(None,re.split(splitstr, compound)))
    separated.append(result)

    return(separated)

for item in ex:
    print(split(item, split_elements))
# Output
# [['Cr', 'O3']]
# [['Cr', '8O21']]
# [['Nb', 'Cr', 'O4']]

如您所见,数字仍然存在,我不知道为什么。我已经搜索了一个类似的问题,但我找不到任何问题(我现在所拥有的已经是疯狂谷歌搜索的结果)。

有没有人有任何解决方案或建议?

【问题讨论】:

    标签: python regex split


    【解决方案1】:

    不要使用拆分,使用 re.findall() 并编写匹配任一大小写的正则表达式:大写可选地后跟小写,或任意数量的数字。

    re.findall(r'[A-Z][a-z]?|\d+', compound)
    

    【讨论】:

    • 我认为这行得通!我会更新它是否适用于一切!
    【解决方案2】:

    您可以使用re.findall 分解化合物。

    >>> import re    
    >>> ex = ['CrO3', 'Cr8O21', 'NbCrO4']
    >>> re.findall('[A-Z][a-z]?|\d*', ex[0])
    ['Cr', 'O', '3']
    >>> re.findall('[A-Z][a-z]*|\d+', ex[1])
    ['Cr', '8', 'O', '21']
    >>> re.findall('[A-Z][a-z]*|\d+', ex[2])
    ['Nb', 'Cr', 'O', '4']
    

    尽管如果您打算做更复杂的事情,您可能应该查看 PyPI 上处理化学的众多软件包之一。

    【讨论】:

    • [a-z]* 是错误的,因为 IUPAC 原子符号在(强制)大写字母之后最多只能有一个小写字母。
    【解决方案3】:

    正则表达式的答案很好,尽管您总是可以用元素编写字典或列表。

    elements = [O, Cr, Nb, ...]

    或者查看https://pubchempy.readthedocs.io/en/latest/等库

    【讨论】:

    • 这对获取化学符号后的数字有何帮助?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多