首页 > 解决方案 > 正则表达式搜索仅适用于我的一半文件,即使所有条目的格式相同

问题描述

我的正则表达式搜索遇到了一些困难,我不太清楚为什么。我有一个值格式如下的文件:

         1  -1   2 SER HA   H   4.477 0.003 1
         2  -1   2 SER HB2  H   3.765 0.001 1
         3  -1   2 SER HB3  H   3.765 0.001 1
         4  -1   2 SER C    C 173.726 0.2   1
         5  -1   2 SER CA   C  58.16  0.047 1
         6  -1   2 SER CB   C  64.056 0.046 1
         7   0   3 HIS H    H   8.357 0.004 1
         8   0   3 HIS HA   H   4.725 0.003 1
         9   0   3 HIS HB2  H   3.203 0.003 2
        .....
         63   7  10 GLU HA   H   4.328 0.004 1
         64   7  10 GLU HB2  H   2.154 0.005 2
         65   7  10 GLU HB3  H   2.156 0.004 2
         66   7  10 GLU HG2  H   2.262 0.014 2
         67   7  10 GLU HG3  H   2.464 0.001 2
         68   7  10 GLU C    C 177.242 0.2   1
         69   7  10 GLU CA   C  59.009 0.068 1
...

我想逐行搜索上述字符串。

import re
with open('delete.txt') as file:
  for lines in file:
    modifier=lines.strip()
    A=re.search('\B\d+\s[A-Z][A-Z][A-Z]\s[A-Z]',modifier)
    if A != None:
        search=A.string
        print(search)

上述文件的格式变化很大,但始终一致的是会有一个数字,然后是 3 个字母,然后是另一个字母。IE2 SER HA

所以我决定使用它作为我的正则表达式搜索,但这并不完全有效。在该63 7 10 GLU行之后它完美地工作,但在此之前它没有找到任何其他条目,尽管它看起来每一行都是相同的格式。

上面的例子是一个 MVE。

任何帮助将不胜感激!

标签: pythonregex

解决方案


我相信您不需要在非单词边界位置开始搜索。你可以添加\blines此外,如果有匹配项,您可以在不从匹配数据对象中获取变量的情况下打印该变量。

利用

import re
with open('delete.txt', 'r') as file:
  for lines in file:
    modifier=lines.strip()                              # Remove leading/trailing whitespace
    if re.search(r'\b\d+\s+[A-Z]{3}\s+[A-Z]',modifier): # If there is a match
        print(modifier)                                 # Print it  

请参阅正则表达式演示

如果您需要获取字段值,请将最后一个替换为[A-Z][A-Z0-9]+请参阅此正则表达式演示

正则表达式详细信息

  • \b- 单词边界
  • \d+- 1+ 位数
  • \s+- 1+ 空格
  • [A-Z]{3}- 三个大写 ASCII 字母
  • \s+- 1+ 空格
  • [A-Z]- 一个大写的 ASCII 字母。

请注意使用原始字符串文字,r'...'这样我们就不必使用表示正则表达式转义的双转义反斜杠。


推荐阅读