pythonregex:仅当模式重复n次时匹配

2024-10-03 00:28:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串: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

我想找出元组(97144),(111158),(121174),(125176),(85174),(10176)(即每种情况下-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)

我想知道是否有一种方法可以只编写一个正则表达式:

^{pr2}$

在这里我加上“只有当上面的短语匹配6次时才匹配”。在

我使用regex101.com来处理Disulphide bond -2.02 ([\d]+) ([\d\s]+){6}之类的东西,因为我在stackoverflow上的其他地方读到,将数字放在括号中可能是一个解决方案;但是我似乎没有找到匹配项。在

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


Tags: 文件to字符串namefrom数量模式情况
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中使用以下代码:

>>> 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个数字

你对{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}-重复非选择组六次。在

相关问题 更多 >