正则表达式如何匹配依赖上一行的行?及PDB文件ATOM项ctags配置
嘿,我来帮你搞定这两个技术问题!
问题1:正则表达式如何根据上一行匹配目标行
正则引擎本身大多是逐行处理文本的,没法直接“记住”上一行内容,但我们可以借助文本处理工具或编程语言的上下文变量来实现这个需求。下面给你几个常用场景的解决方案:
用
sed实现:sed可以通过N命令把下一行读入模式空间,结合匹配规则筛选目标行。比如你想匹配上一行包含START的所有下一行,可以用:sed -n '/START/{n;p}' your_file.txt解释:
-n控制只输出匹配的行;/START/匹配到包含START的行后,n跳转到下一行,p打印当前行。用
awk实现:awk可以通过变量记录上一行的内容,然后在当前行判断是否符合条件。同样以上一行包含START为例:awk 'prev ~ /START/ {print} {prev=$0}' your_file.txt解释:
prev变量保存上一行内容;如果上一行匹配START,就打印当前行;最后把当前行赋值给prev,循环处理下一行。Python代码实现:
逐行读取文件时保存上一行内容,再进行匹配判断:with open("your_file.txt", "r") as f: prev_line = "" for line in f: if "START" in prev_line: print(line.strip()) prev_line = line
针对PDB文件的ATOM条目,你需要自定义ctags的正则规则,同时让ctags只保留每个关键词的首次出现标签。下面是具体的配置方案:
1. 编写ctags配置文件
在你的用户目录(~/.ctags)或者当前项目目录创建.ctags文件,添加以下内容:
# 定义PDB语言类型 --langdef=pdb # 映射.pdb后缀到pdb语言 --langmap=pdb:.pdb # 自定义正则匹配ATOM行的残基名(符合PDB标准格式,第4列是残基名称) --regex-pdb=/^ATOM\s+\d+\s+\w+\s+(\w+)\s+.*/\1/A,amino acid/ # 开启唯一标签模式,相同标签只保留第一次出现的条目 --unique=yes
解释:
- 正则部分
^ATOM\s+\d+\s+\w+\s+(\w+)\s+.*捕获ATOM行中的残基名称(比如ALA、SER这类); --unique=yes会让ctags自动合并相同的标签,只保留该标签第一次出现的位置。
2. 生成tags文件
在终端运行以下命令生成tags:
ctags -R *.pdb
之后在Vim中打开PDB文件,就可以用Ctrl+]跳转到对应残基的首次出现位置,用Ctrl+T返回。
额外调整说明
如果你需要匹配其他关键词(比如链ID、原子名),只需要调整正则中的捕获组位置即可。比如要捕获链ID(PDB行第5列),可以把正则改成:
--regex-pdb=/^ATOM\s+\d+\s+\w+\s+\w+\s+(\w)\s+.*/\1/C,chain/
内容的提问来源于stack exchange,提问作者Tommaso Laurenzi
相关产品推荐
相关产品推荐

