尝试通过正则表达式将字符串匹配为3部分,但是第三部分通常包含在第二部分中

时间:2019-01-28 08:21:02

标签: python regex

我最近从事的项目与正则表达式有关。 有一个长字符串由我关心的几个子字符串组成,该子字符串通过空字符串或其他字符串直接或间接连接。 子字符串由3组组成,第一部分是以下3个字母之一(Glc | Gal | Man | Fuc),第二部分是[a-zA-Z0-9]的不固定长度,第三部分是部分是“ a”或“ b”。棘手的是,第二部分和第三部分有时会被省略。 如果我使用贪婪匹配,则最后一个a和b将包含在第二个组中。但是,如果我使用惰性匹配,第二部分将缺少字符。

一些预期的例子:

Glc -> (Glc)(None)(None)
GlcF42x -> (Glc)(F42x)(None)
GlcF4ds2dsa2xa -> (Glc)(F4ds2dsa2x)(a)
Glcb -> (Glc)(None)(b)

所有这些子字符串都是较长字符串的一部分。 像:"sklaja**Glc**someotherstring**GlcF42x**hmmmm**GlcF4ds2dsa2xa**lol**Glcb**dsadas"

任何建议都会很棒。 在python中是首选。

1 个答案:

答案 0 :(得分:0)

如何将其分为2个步骤? 在步骤1上,您得到第一部分(Glc | Gal | Man | Fuc),其余部分得到。 在第2步中,您尝试识别是否可以从末尾得到[a,b]:

GlcF4ds2dsa2xa:

>>> step1 = re.match('(Glc|Gal|Man|Fuc)([a-zA-Z0-9]+)', 'GlcF4ds2dsa2xa')
>>> step1
<re.Match object; span=(0, 14), match='GlcF4ds2dsa2xa'>
>>> step1.group(1)
'Glc'
>>> step1.group(2)
'F4ds2dsa2xa'
>>> sub1 = step1.group(2)
>>> step2 = re.match('([a-zA-Z0-9]+)([a,b]+)', sub1)
>>> step2
<re.Match object; span=(0, 11), match='F4ds2dsa2xa'>
>>> step2.group(1)
'F4ds2dsa2x'
>>> step2.group(2)
'a'
>>> ans = [step1.group(1), step2.group(1), step2.group(2)]
>>> ans
['Glc', 'F4ds2dsa2x', 'a']

GlcF42x:

>>> step1 = re.match('(Glc|Gal|Man|Fuc)([a-zA-Z0-9]+)', 'GlcF42x')
>>> step1
<re.Match object; span=(0, 7), match='GlcF42x'>
>>> step1.group(1)
'Glc'
>>> step1.group(2)
'F42x'
>>> sub1 = step1.group(2)
>>> step2 = re.match('([a-zA-Z0-9]+)([a,b]+)', sub1)
>>> step2
>>> step2 is None
True
>>> 

现在您知道第二场比赛没有成功,因此您只能将其分为两个部分进行处理。

总而言之,如果仅确定可能的第三部分是“ a”或“ b”,并且该字母不能出现在字符串的第二部分末尾,那么我的解决方法应该会有所帮助。