正则表达式搜索只适用于我的一半文件,即使所有条目的格式都相同

2024-05-19 14:31:02 发布

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

我的正则表达式搜索有点困难,我不知道为什么。我有一个文件,其值的格式如下:

         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个字母,后面跟着另一个字母。即2 SER HA

所以我决定用它作为我的正则表达式搜索,但这不太管用。在63 7 10 GLU行之后,它工作得很好,但是它找不到之前的任何其他条目,尽管事实上每一行都是相同的格式

上面的示例是一个MVE

任何帮助都将不胜感激


Tags: 文件research格式字母sercafile
2条回答
import re
fhand=open('delete.txt')
for line in fhand:
    inp=line.rstrip()
    x=re.findall('^\d\s\S\d\s(\d\s\S+\s\S+)',inp) 
    if len(x) >0:  
        print(x)  

我相信您不需要在非单词边界位置开始搜索。不过,您可以添加\b。此外,如果存在匹配项,则可以打印lines变量,而不从匹配数据对象获取它

使用

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  

regex demo

如果需要获取字段值,请将最后一个[A-Z]替换为[A-Z0-9]+,请参见this regex demo

正则表达式详细信息

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

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

相关问题 更多 >