python - Python正则表达式:仅当模式重复n次时才匹配
问题描述
我有一个字符串:Name Mass From To Disulphide bond -2.02 97 144 Disulphide bond -2.02 111 158 Disulphide bond -2.02 121 174 Disulphide bond -2.02 125 176 Disulphide bond -2.02 85 174 Disulphide bond -2.02 10 176
我想提取元组 (97,144), (111,158), (121,174),(125,176), (85,174), (10,176) (即每种情况下 -2.02 之后的数字对)。
我只想匹配与这个确切数量的重复模式匹配的字符串(即“二硫键-2.02 X X”的相同单词模式重复6次)。文件中将有其他字符串具有完全相同的模式,但重复次数多于或少于 6 次(例如,文件中的另一个字符串可能是'Name Mass From To Disulphide bond -2.02 97 144 Disulphide bond -2.02 111 158 Disulphide bond -2.02 121 174'
,我不想匹配这个)。
我最初是在写这样的正则表达式:
six_regex = re.search(r'Name Mass From To Disulphide bond -2.02 ([\d]+) ([\d]+) Disulphide bond -2.02 ([\d]+) ([\d]+) Disulphide bond -2.02 ([\d]+) ([\d]+) Disulphide bond -2.02 ([\d]+) ([\d]+) Disulphide bond -2.02 ([\d]+) ([\d]+) Disulphide bond -2.02 ([\d]+) ([\d]+)',mod_line)
我想知道是否有办法只写一个正则表达式,如:
ix_regex = re.search(r' Disulphide bond -2.02 ([\d]+) ([\d]+) ',mod_line)
我在其中添加“仅当上述短语匹配 6 次时才匹配”。
我正在使用 regex101.com 来处理类似的事情,Disulphide bond -2.02 ([\d]+) ([\d\s]+){6}
因为我在 stackoverflow 的其他地方读到,将数字放在括号中可能是一个解决方案;但我似乎没有匹配。
有人可以建议一个更整洁的正则表达式,我需要匹配一个重复的模式 n 次才能匹配。
解决方案
您可以在 python 中使用此代码:
>>> import re
>>> s = 'Name Mass From To Disulphide bond -2.02 97 144 Disulphide bond -2.02 111 158 Disulphide bond -2.02 121 174 Disulphide bond -2.02 125 176 Disulphide bond -2.02 85 174 Disulphide bond -2.02 10 176'
>>> arr = re.findall(r'(?<=Disulphide bond -2.02 )(\d+) (\d+)', s)
>>> if len(arr) == 6:
... print arr
...
[('97', '144'), ('111', '158'), ('121', '174'), ('125', '176'), ('85', '174'), ('10', '176')]
**正则表达式详细信息:&&
(?<=Disulphide bond -2.02 )
: Lookbehind 表达式断言我们在当前位置的左边给出了字符串(\d+) (\d+)
:匹配 2 个不同捕获组中由 2 个空格分隔的 2 个数字