Skip to main content
 首页 » 编程设计

Python 正则表达式 : match only if pattern is repeated n number of times

2025年05月04日25shihaiming

我有一个字符串:名称质量从到二硫键 -2.02 97 144 二硫键 -2.02 111 158 二硫键 -2.02 121 174 二硫键 -2.02 125 176 二硫键 -2.02 85 174 二硫键 -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 二硫键 -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')] 

Code Demo

**正则表达式详细信息:&&

  • (?<=Disulphide bond -2.02 ) : 后视表达式断言我们在当前位置的左侧给出了字符串
  • (\d+) (\d+) : 在 2 个不同的捕获组中匹配由 2 个空格分隔的 2 个数字