首页 > 解决方案 > 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 次才能匹配。

标签: pythonregex

解决方案


您可以在 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 个数字

推荐阅读