2016-01-18 231 views
2

我有醜陋的字符串:插入字符字符串結束數

oldstr = "0.100% fDrg: 2%,dgdv: 29% fGd dg 0.2%, Ghh-sf 2.2 dbgh: NONE dfgdf6 gd 3 " 

需要通過這個號碼的最後一位數字爲一次分割後插入字符|插入|。另外也看重none,其中也添加了這個分離器:

0.100| fdrg: 2|,dgdv: 29| fgd dg 0.2|, ghh-sf 2.2|dbgh: none| dfgdf6|gd 3| 

嘗試這一點,但沒有成功:

print re.sub(r'(\d+[a-z %^.])', r'\1|', oldstr.lower()) 

0.|100%| fdrg: 2%|,dgdv: 29%| fgd dg 0.|2%|, ghh-sf 2.|2 |dbgh: none dfgdf6 |gd 3 | 

任何幫助將不勝感激。

+0

最糟糕的是,你似乎試圖修剪後的附帶價值整數。你真的需要嗎?另外,我沒有看到將'none'變成小寫字母的簡單方法。檢查['(\ bnone \ b | \ d +(?:\。\ d +)?)%?'](https://regex101.com/r/hZ8yN7/1)。 –

回答

4

您可以使用

(\bnone\b|\d+(?:\.\d+)?)%? 

而且隨着\1|取代。

說明

  • (\bnone\b|\d+(?:\.\d+)?) - 第1組匹配2個備選方案:
    • \bnone\b - 全詞none
    • | - 或...
    • \d+(?:\.\d+)? - 一個浮點值( \d+匹配一個或多個數字,並且(?:\.\d+)?個匹配(可選地)的點,接着與一個或多個數字)
  • %? - 任選的(因爲?裝置匹配一個或零次%符號

參見regex demo

Python代碼:

import re 
p = re.compile(ur'(\bnone\b|\d+(?:\.\d+)?)%?', re.IGNORECASE) 
test_str = "0.100% fDrg: 2%,dgdv: 29% fGd dg 0.2%, Ghh-sf 2.2 dbgh: NONE dfgdf6 gd 3 " 
subst = "\1|" 
result = re.sub(p, subst, test_str) 

如果您需要修改這些值,則可以在分割後進行修改。另外,在處理re.sub(r'\b\none\b', 'NONE', input)的文本之前,none可以變成小寫。

4

如何:

>>> re.sub(r"([\d\.]+|NONE)%?", r"\1|", oldstr) 
'0.100| fDrg: 2|,dgdv: 29| fGd dg 0.2|, Ghh-sf 2.2| dbgh: NONE| dfgdf6| gd 3| ' 

在這裏,我們捕獲的數字和點一個或多個字符的字符串或在capturing group一個NONE(後跟可選%號),並與自身和管道字符替換它。

請注意,@Wiktor's capturing part of the regular expression比這個答案要好得多。

2
import re 
oldstr = "0.100% fDrg: 2%,dgdv: 29% fGd dg 0.2%, Ghh-sf 2.2 dbgh: NONE dfgdf6 gd 3" 

newstring = re.sub(r"([\.\d]+)", r"\1|", oldstr) 
print newstring.replace("%","").replace("NONE","NONE|") 

輸出:

0.100| fDrg: 2|,dgdv: 29| fGd dg 0.2|, Ghh-sf 2.2| dbgh: NONE| dfgdf6| gd 3| 

後多一點思考這裏是一個班輪:

print re.sub(r"([\.\d'NONE']+)%?", r"\1|", oldstr)