【问题标题】:Python regular expression to split parameterized text filePython正则表达式拆分参数化文本文件
【发布时间】:2018-04-26 15:19:00
【问题描述】:

我正在尝试重复拆分包含“string = float”格式的文件。 下面是文件的样子。

+name1 = 32    name2= 4
+name3 = 2     name4 = 5
+name5 = 2e+23
...  

我希望他们把它写成字典。 喜欢……

a={name1:32, name2:4, name3:2, name4:5, name5:2e+23}

我是正则表达式的新手,很难弄清楚该怎么做。 经过一番谷歌搜索后,我尝试执行以下操作以删除“+”字符和空格..

p=re.compile('[^+\s]+')
splitted_list=p.findall(lineof_file)

但这给了我两个问题.. 1.当没有空格btw名称和“=”符号时,它不会分裂。 2. 对于像 2e+23 这样的数字,它将 + 号分开。

在对 depperm 的代码进行一些修改后,我设法解析了文件。
但我面临另一个问题。 为了更好地解释我的问题。下面是我的文件的样子。 + 号后可以出现多个参数和值对,并带有 '=' 号。 参数名称可以在任意位置包含字母和数字。值也可以包含带有科学通知的 +- 符号(E/e-+)。有时 value 可以是一个数学表达式,如果它是单引号的。

+ abc2dfg3  = -2.3534E-03    dfe4c3= 2.000
+ abcdefg= '1.00232e-1*x' * bdfd=1e-3

我设法使用下面的正则表达式解析上述内容。

re.findall("(\w+)\s*=\s*([+-]?[\d+.Ee+-]+|'[^']+')",eachline)

但现在我的问题有时像“* bdfd=1e-3”,可能会有一些评论。我的文件中 *(asterisk) 之后的任何内容都应视为注释,但如果 * 存在于单引号字符串中,则不应视为注释。 使用上面的正则表达式,它也解析“bdfd=1e-3”,但我希望它不被解析。 我试图找到解决方案几个小时,但到目前为止我找不到任何解决方案。

【问题讨论】:

    标签: python regex python-2.7


    【解决方案1】:

    我建议只获取名称和值,而不是担心空格或不需要的字符。我会使用这个正则表达式:(name\d+)\s?=\s?([\de+]+),它将获取名称,然后即使它有 e 或空格,您也可以对数字进行分组。

    import re
    p=re.compile('(name\d+)\s*=\s*([\de+]+)')
    
    a ={}
    with open("file.txt", "r") as ins:
        for line in ins:
            splitted_list=p.findall(line)
            #splitted_list looks like: [('name1', '32'), ('name2', '4')]
            for group in splitted_list:
                a[group[0]]=group[1]
    print(a)
    #{'name1': '32', 'name2': '4', 'name3': '2', 'name4': '5', 'name5': '2e+23'}
    

    【讨论】:

      【解决方案2】:

      您不需要正则表达式来实现您的目标。您可以使用built-in Python 方法。

      your_dictionary = {}
      # Read the file 
      with open('file.txt','r') as fin:
        lines = fin.readlines()
      # iterate over each line
      for line in lines:
        splittedLine = line.split('=')
        your_dictionary.push({dict.push({
        key:   splittedLine[0],
        value: splittedLine[1]
      });
      print(your_dictionary)
      

      希望对你有帮助!

      【讨论】:

        【解决方案3】:

        您可以将正则表达式与字符串拆分结合起来:

        创建文件:

        t =""" 
        
        +name1 = 32    name2= 4
        +name3 = 2     name4 = 5
        +name5 = 2e+23"""
        
        fn = "t.txt"
        with open(fn,"w") as f:
            f.write(t)
        

        拆分文件:

        import re
        d = {}
        with open(fn,"r") as f:
            for line in f:    # proces each line
                g = re.findall(r'(\w+ ?= ?[^ ]*)',line)    # find all name = something
                for hit in g:                              # something != space
                    hit = hit.strip()                      # remove spaces
                    if hit:
                        key, val = hit.split("=")          # split and strip and convert  
                        d[key.rstrip()] = float(val.strip())   # put into dict
        print d
        

        输出:

        {'name4': 5.0, 'name5': 2e+23, 'name2': 4.0, 'name3': 2.0, 'name1': 32.0}
        

        【讨论】:

          猜你喜欢
          • 2022-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-23
          相关资源
          最近更新 更多