正则表达式中最大化子字符串匹配

2024-10-05 13:18:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从单词中提取元素符号(如果有)。为此,我准备了一个正则表达式匹配模式,由元素周期表中所有元素的符号组成。在

H|He|Li|Be|B|C|N|O|F|Ne|Na|Mg|Al|Si|P|S|Cl|Ar|K|Ca|Sc|Ti|V|Cr|Mn|Fe|Co|Ni|Cu|Zn|Ga|Ge|As|Se|Br|Kr|Rb|Sr|Y|Zr|Nb|Mo|Tc|Ru|Rh|Pd|Ag|Cd|In|Sn|Sb|Te|I|Xe|Cs|Ba|La|Ce|Pr|Nd|Pm|Sm|Eu|Gd|Tb|Dy|Ho|Er|Tm|Yb|Lu|Hf|Ta|W|Re|Os|Ir|Pt|Au|Hg|Tl|Pb|Bi|Po|At|Rn|Fr|Ra|Ac|Th|Pa|U|Np|Pu|Am|Cm|Bk|Cf|Es|Fm|Md|No|Lr|Rf|Db|Sg|Bh|Hs|Mt

现在,对于给定的单词,我想使用上面的regex模式从中提取元素。我现在面临的问题是

^{pr2}$

我能提取

C,In,S

作为元素。这是我需要的不正确的提取

Cu, In, Se

而我得到的是“C,In,S”,我相信这是因为匹配模式在“Cu”之前看到“C”,在“Se”之前看到“S”(例如,当前的匹配模式是like)

C | In | S | Cu | Se

为了解决这个问题,我想,我必须通过搜索模式中的所有单词来确保regex匹配我单词中最大数量的字符。在


Tags: in元素模式符号libe单词regex
3条回答

您还可以使用regex模块的命名列表:

>>> import regex
>>> s='H|He|Li|Be|B|C|N|O|F|Ne|Na|Mg|Al|Si|P|S|Cl|Ar|K|Ca|Sc|Ti|V|Cr|Mn|Fe|Co|Ni|Cu|Zn|Ga|Ge|As|Se|Br|Kr|Rb|Sr|Y|Zr|Nb|Mo|Tc|Ru|Rh|Pd|Ag|Cd|In|Sn|Sb|Te|I|Xe|Cs|Ba|La|Ce|Pr|Nd|Pm|Sm|Eu|Gd|Tb|Dy|Ho|Er|Tm|Yb|Lu|Hf|Ta|W|Re|Os|Ir|Pt|Au|Hg|Tl|Pb|Bi|Po|At|Rn|Fr|Ra|Ac|Th|Pa|U|Np|Pu|Am|Cm|Bk|Cf|Es|Fm|Md|No|Lr|Rf|Db|Sg|Bh|Hs|Mt'
>>> p=regex.compile(r"\L<options>", options=s.split('|'))
>>> p.findall('CuIn2Se')
['Cu', 'In', 'Se']

另一个简单的方法

x="CuIn2Se"
print re.findall(r"(?:C|In|S|Cu|Se)(?=[A-Z0-9]|$|\s)",x)

Online Demo

正确的方法是按长度的降序排列所有元素

>>> import re
>>> pat = re.compile('Cu|In|Se|C|S')
>>> s = 'CuIn2Se'
>>> pat.findall(s)
['Cu', 'In', 'Se']

这在docs中有清楚的解释

小纸条

考虑到输入字符串很长,我编写了一个小脚本,使其按长度的降序排序。可能对你有帮助

^{2}$

相关问题 更多 >

    热门问题