2016-01-18 164 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)