在包含单独原子的列表中转换一串化学元素
Turning a string of chemical elements in a list containing the separate atoms
我正在尝试从包含化学式的字符串创建一个列表,如下例所示:
structuralFormula1 = 'OCaOSeOO'
在列表中,我希望所有化学原子彼此分开,如下所示:
structuralFormula1_list = ['O', 'Ca', 'O', 'Se', 'O', 'O']
我不知道如何开始解决这个问题。任何提示将不胜感激!
提前致谢:)
你可以 re.split
环顾四周:
import re
structuralFormula1 = 'OCaOSeOO'
print(re.split(r'(?<!^)(?=[A-Z])', structuralFormula1))
它在每个位置分裂
- 前面没有字符串的开头:
(?<!^)
=> 这避免了前导空匹配
- 后跟一个大写字母:
(?=[A-Z])
输出:
['O', 'Ca', 'O', 'Se', 'O', 'O']
使用re.findall
:
>>> import re
>>> ex = 'OCaOSeOO'
>>> re.findall('[A-Z][a-z]?', ex)
['O', 'Ca', 'O', 'Se', 'O', 'O']
正则表达式解释:
[A-Z]
: 匹配大写字母
[a-z]
: 匹配小写字母
[A-Z][a-z]
: 匹配大写字母后跟小写字母
[A-Z][a-z]?
: 匹配大写字母后跟 0 或 1 个小写字母
[A-Z][a-z]*
:匹配大写字母后跟 0 个或多个小写字母。 (* 是贪心的,找到多少就匹配多少)
>>> import re
>>> ex = 'OCaOSeOO'
>>> re.findall('[A-Z]', ex)
['O', 'C', 'O', 'S', 'O', 'O']
>>> re.findall('[A-Z][a-z]', ex)
['Ca', 'Se']
>>> re.findall('[A-Z][a-z]?', ex)
['O', 'Ca', 'O', 'Se', 'O', 'O']
>>>
编辑#1:对于评论中提到的另一个例子:
>>> ex = 'ABbCccDdddEeeeeFfffffGggggggg'
>>> re.findall('[A-Z][a-z]*', ex)
['A', 'Bb', 'Ccc', 'Dddd', 'Eeeee', 'Ffffff', 'Gggggggg']
使用re.findall
import re
re.findall('.[^A-Z]*', 'OCaOSeOO')
输出:
['O', 'Ca', 'O', 'Se', 'O', 'O']
我正在尝试从包含化学式的字符串创建一个列表,如下例所示:
structuralFormula1 = 'OCaOSeOO'
在列表中,我希望所有化学原子彼此分开,如下所示:
structuralFormula1_list = ['O', 'Ca', 'O', 'Se', 'O', 'O']
我不知道如何开始解决这个问题。任何提示将不胜感激! 提前致谢:)
你可以 re.split
环顾四周:
import re
structuralFormula1 = 'OCaOSeOO'
print(re.split(r'(?<!^)(?=[A-Z])', structuralFormula1))
它在每个位置分裂
- 前面没有字符串的开头:
(?<!^)
=> 这避免了前导空匹配 - 后跟一个大写字母:
(?=[A-Z])
输出:
['O', 'Ca', 'O', 'Se', 'O', 'O']
使用re.findall
:
>>> import re
>>> ex = 'OCaOSeOO'
>>> re.findall('[A-Z][a-z]?', ex)
['O', 'Ca', 'O', 'Se', 'O', 'O']
正则表达式解释:
[A-Z]
: 匹配大写字母[a-z]
: 匹配小写字母[A-Z][a-z]
: 匹配大写字母后跟小写字母[A-Z][a-z]?
: 匹配大写字母后跟 0 或 1 个小写字母[A-Z][a-z]*
:匹配大写字母后跟 0 个或多个小写字母。 (* 是贪心的,找到多少就匹配多少)
>>> import re
>>> ex = 'OCaOSeOO'
>>> re.findall('[A-Z]', ex)
['O', 'C', 'O', 'S', 'O', 'O']
>>> re.findall('[A-Z][a-z]', ex)
['Ca', 'Se']
>>> re.findall('[A-Z][a-z]?', ex)
['O', 'Ca', 'O', 'Se', 'O', 'O']
>>>
编辑#1:对于评论中提到的另一个例子:
>>> ex = 'ABbCccDdddEeeeeFfffffGggggggg'
>>> re.findall('[A-Z][a-z]*', ex)
['A', 'Bb', 'Ccc', 'Dddd', 'Eeeee', 'Ffffff', 'Gggggggg']
使用re.findall
import re
re.findall('.[^A-Z]*', 'OCaOSeOO')
输出:
['O', 'Ca', 'O', 'Se', 'O', 'O']