Python正则表达式:仅当模式重复n次时才匹配

Posted

技术标签:

【中文标题】Python正则表达式:仅当模式重复n次时才匹配【英文标题】:Python regex: match only if pattern is repeated n number of times 【发布时间】:2019-09-05 08:08:43 【问题描述】:

我有一个字符串: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 之类的东西,因为我在 *** 的其他地方读到,将数字放在括号中可能是一个解决方案;但我似乎没有匹配到。

有人可以建议一个更整洁的正则表达式,我需要匹配一个重复的模式 n 次才能匹配。

【问题讨论】:

你的意思是必须有 6 个 连续 Disulphide bond X X X 还是匹配项可以出现在字符串中的任何位置?请检查this approach,以防它们出现在字符串中的任何位置。 试试Name Mass From To (?:Disulphide bond -2.02 ([\d]+) ([\d]+))6 如果它们必须是连续的,请参见ideone.com/P32pbg。 【参考方案1】:

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

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

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

【讨论】:

这假设匹配可以出现在字符串中的任何位置,就像I suggested【参考方案2】:

6 量词你有正确的想法。

您的问题是没有分组((?:) - 非选择组)正确的模式。

Name Mass From To (?:Disulphide bond -2\.02 ([\d]+) ([\d]+)\s*)6 应该可以解决问题。

说明

Name Mass From To - 字符串的开头。 (?: - 打开非选择组。 Disulphide bond -2\.02 ([\d]+) ([\d]+)\s* - 你想要重复的模式 ) - 关闭非选择组。 6 - 重复非选择组六次。

【讨论】:

【参考方案3】:

如果我理解正确,您可以使用

reg1 = re.compile(r"(?:\s?Disulphide bond  -2.02  [\d]+  [\d]+\s?)6")
matches = reg1.findall(your_string)

reg2 = re.compile(r"Disulphide bond  -2.02  ([\d]+)  ([\d]+)")
pairs = [reg2.findall(el) for el in matches]

首先你匹配这个主题重复六次的所有实例,然后你从每个实例中提取对

【讨论】:

以上是关于Python正则表达式:仅当模式重复n次时才匹配的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:仅当某个列值在过去 N 个月内出现 N 次时才保留行

仅当没有给定前缀具有任意数量的空格时才匹配单词

正则表达式匹配捕获组前面没有某些字符

正则表达式:匹配单个数字重复n次

仅当两者之间存在某些文本时,正则表达式才匹配星号

Python数据分析学习-re正则表达式模块