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
**正则表达式详细信息:&&
(?<=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次时才匹配的主要内容,如果未能解决你的问题,请参考以下文章