Python正则表达式在特定字符串后的花括号中查找所有内容

Python正则表达式在特定字符串后的花括号中查找所有内容,python,regex,python-3.x,Python,Regex,Python 3.x,嗨,所以我有点和正则表达式斗争。我有一个rpt文件,需要从中获取特定数据。该文件看起来有点像这样: lots of text... [MS] { ;Mass % BPI 238.85 0.943 247.64 0.984 378.65 0.990 ... } lots of text... 在这个字符串出现后,我想把所有内容都放在花括号内:[MS]。问题是这个文件中有更多的花括号,它们不仅仅围绕着我需要的数据 我已经尝试过的是: import re file = input("En

嗨,所以我有点和正则表达式斗争。我有一个rpt文件,需要从中获取特定数据。该文件看起来有点像这样:

lots of text...
[MS]
{
;Mass   % BPI
238.85  0.943
247.64  0.984
378.65  0.990
...
}
lots of text...
在这个字符串出现后,我想把所有内容都放在花括号内:[MS]。问题是这个文件中有更多的花括号,它们不仅仅围绕着我需要的数据

我已经尝试过的是:

import re

file = input("Enter file path: ")
if len(file) < 1:
    file = "path"
handle = open(file)

pattern = r'^([-0-9\.eE+]+)[ \t]*(;|,)?[ \t]*([-0-9\.eE+]*)$'
findings = re.findall(pattern, handle)

print(findings)

#and then making a single dict out of it with key-value pairs
重新导入
文件=输入(“输入文件路径:”)
如果len(文件)<1:
file=“path”
句柄=打开(文件)
pattern=r'^([-0-9\.eE+])[\t]*(;|,)?[\t]*([-0-9\.eE+]*)$'
调查结果=关于findall(模式、手柄)
印刷(调查结果)
#然后用键值对把它做成一个dict
但这并没有给我所需要的一切,它返回了一些值,但不是全部

最后,我希望将花括号内的数字作为字典(例如:Key:238.85,Value:0.943),以便以后可以绘制它


注:体量和BPI“列”之间的空格为制表符。

执行多阶段提取过程。第一阶段是一个正则表达式,它在MS之后提取括号之间的内容:

re.search(r"\[MS\]\s*{([^}]+)}", s).group(0)

从那里您可以逐行解析数据。

您可以在
{
}
之后提取
[MS]
之间的所有块,然后从块中提取所有必要的数据:

import re
results = []

with open(path_to_file, 'r') as r:
    for block in re.findall(r'\[MS\]\s*{([^{}]+)}', r.read()):
        results.extend(re.findall(r'^(\d[\d.]*)\t(\d[\d.]*)$', block, re.M))

print(dict(results))

块匹配正则表达式

  • \[MS\]
    -文字
    [MS]
    文本
  • \s*
    -0+空格
  • {
    -a
    {
    字符
  • ([^{}]+)
    -第1组(这是
    re.findall
    将返回的内容):除
    {
    }
    之外的任何1+字符
  • }
    -a
    }
    字符
数字提取正则表达式

  • ^
    -行的开始(由于
    re.M
  • (\d[\d.]*)
    -组1(键):一个数字,然后是任何0+数字或点
  • \t
    -一个选项卡
  • (\d[\d.]*)
    -第2组(值):一个数字,然后是任何0+数字或点
  • $
    -行尾(由于
    re.M

[MS]
之后,块内是否还会有
{
}
吗?没有,在该块之后,它会再次关闭,但没有任何内部。是否有多个块,或者它总是单个/唯一的?如果使用,您可能会使用基于正则表达式的。现在无法给出答案。@Wiktor Stribiżew yes如果我使用了很多答案,它会给我一个错误:TypeError:预期的字符串或字节,如object@bimarian这只意味着您没有将数据作为单个字符串传递给
re
方法。在问题中显示所有相关代码。Ok将在question@bimarian你是说
\[MS\]
可以是
[APPLE]
等吗。?请尝试
re.findall(r'\[{}\]\s*{([^{{}]+)}}.format(re.escape(key)),r.read())