我有一个正则表达式来匹配字符串的各个部分(特别是带有修饰的肽序列),并且我想使用re.findall来获取字符串的所有部分:
该序列可以以可选的后缀开头,该后缀可以是任何非大写字母字符串,后跟-
.
该序列还可以具有以-
开头的前缀,后跟非大写字母字符串.
序列的其余部分应该用大写字母分隔,每个字母都有一个可选的前缀.
例如.
"foo-ABcmCD-bar"
->;['foo-','A','B','cmC','D','-bar']
"DEF"
->;['','D','E','F','']
"WHATEVER-foo"
->;['', 'W', 'H', 'A', 'T', 'E', 'V', 'E', 'R', '-foo']
"cmC-foo"
->;['', 'cmC', '-foo']
"ac-cmC-foo"
->;['ac-', 'cmC', '-foo']
我所拥有的是:
(?:(^(?:[^A-Z]+-)?)|((?:-[^A-Z]+)?$)|((?:[^A-Z]*)?[A-Z]))
捕获组1 (^(?:[^A-Z]+-)?)
应该捕获可选的前缀或空字符串.
捕获组2 ((?:-[^A-Z]+)?$)
应该捕获可选后缀或空字符串.
捕获组3((?:[^A-Z]*)?[A-Z])
被认为捕获字符串的其余部分中可能具有非大写字符的子串的任何大写字符.
我得到可选的前缀或空字符串.
后缀似乎几乎可以工作--但如果有后缀,则行尾匹配两次,一次与后缀匹配,另一次与空字符串匹配.
>>> re.findall(r,"foo-ABC-bar")
['foo-', 'A', 'B', 'C', '-bar', '']
>>> re.findall(r,"ABC-bar")
['', 'A', 'B', 'C', '-bar', '']
>>> re.findall(r,"ABcmC")
['', 'A', 'B', 'cmC', '']
即,我如何处理多余的空字符串,或者为什么$匹配两次?