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

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

我最近从事的项目与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步中,你得到第一部分(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']
>>第1步=重新匹配(“(Glc | Gal | Man | Fuc)([a-zA-Z0-9]+)”,“GLCF4DS2SA2XA”)
>>>步骤1
>>>步骤1.分组(1)
“Glc”
>>>步骤1.分组(2)
“F4ds2dsa2xa”
>>>sub1=步骤1.组(2)
>>>步骤2=重新匹配('([a-zA-Z0-9]+)([a,b]+)',子1)
>>>步骤2
>>>步骤2.分组(1)
“F4ds2dsa2x”
>>>步骤2.分组(2)
“a”
>>>ans=[步骤1.组(1),步骤2.组(1),步骤2.组(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
>>> 
>>第1步=重新匹配('(Glc | Gal | Man | Fuc)([a-zA-Z0-9]+)','GlcF42x')
>>>步骤1
>>>步骤1.分组(1)
“Glc”
>>>步骤1.分组(2)
“F42x”
>>>sub1=步骤1.组(2)
>>>步骤2=重新匹配('([a-zA-Z0-9]+)([a,b]+)',子1)
>>>步骤2
>>>第二步没有
真的
>>> 
现在您知道第二场比赛没有成功,所以您可以将其作为两部分进行处理


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

是的,我已经考虑过了。问题是,现有的基础设施希望我只改变regex模式来实现这一点。你的解决方案肯定有效。只是我可能需要更改代码中的其他位置。谢谢如果你觉得我的答案有用的话,请你投票给我好吗?事实上我投票给你了,但我没有注册,因为我没有15分。无论如何,谢谢!