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 个字母,然后是另一个字母。IE2 SER HA
所以我决定使用它作为我的正则表达式搜索,但这并不完全有效。在该63 7 10 GLU
行之后它完美地工作,但在此之前它没有找到任何其他条目,尽管它看起来每一行都是相同的格式。
上面的例子是一个 MVE。
任何帮助将不胜感激!
解决方案
我相信您不需要在非单词边界位置开始搜索。你可以添加\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
请参阅正则表达式演示。
如果您需要获取字段值,请将最后一个替换为[A-Z]
,[A-Z0-9]+
请参阅此正则表达式演示。
正则表达式详细信息
\b
- 单词边界\d+
- 1+ 位数\s+
- 1+ 空格[A-Z]{3}
- 三个大写 ASCII 字母\s+
- 1+ 空格[A-Z]
- 一个大写的 ASCII 字母。
请注意使用原始字符串文字,r'...'
这样我们就不必使用表示正则表达式转义的双转义反斜杠。
推荐阅读
- c++ - 如何在 C++ 中获取二维数组中一列的最小数量?
- python - 如何在不使用 Flask 的情况下将 Python Telegram Bot 部署到 Azure?
- sql-server - 无法创建大于允许的最大行大小 8060 的大小为 8084 的行
- java - 如何在 Apache Poi 中使用公式保存 excel?
- javascript - JS - 有没有办法在不丢失默认功能的情况下将 CSS 样式添加到 JSON 控制台日志消息?
- asp.net - IApplicationBuilder.UseBasePath 奇怪的行为?
- python - 在 python3 中导入超出顶级包失败
- java - 我收到一些关于 java 中无法访问的代码的错误,如何修复它。我用日食霓虹灯
- bash - fswatch 和 ffmpeg 中的输出文件扩展名
- qt - qInstallMessageHandler() 不返回文件行、文件名、函数名