簡體   English   中英

Python正則表達式拆分參數化文本文件

[英]Python regular expression to split parameterized text file

我試圖重復拆分包含'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- +)。 如果單引號括起來,有時值可以是數學表達式。

+ 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”,可能會有一些評論。 我文件中*(星號)之后的所有內容均應視為注釋,但如果*用單引號引起來,則不會被視為注釋。 使用上述正則表達式,它也可以解析“ bdfd = 1e-3”,但我希望它不會被解析。 我嘗試了數小時的解決方案,但到目前為止找不到任何解決方案。

我建議只抓住名稱和值,而不用擔心空格或不需要的字符。 我將使用以下正則表達式: (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'}

您可以將正則表達式與字符串拆分結合使用:

創建文件:

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}

您不需要正則表達式即可實現目標。 您可以使用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)

希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM