我有丑陋的字符串:
oldstr = "0.100% fDrg: 2%,dgdv: 29% fGd dg 0.2%, Ghh-sf 2.2 dbgh: NONE dfgdf6 gd 3 "
我需要在数字的最后一位数后面插入char |
,以便通过此插入的|
进行下一次拆分。还有值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 :(得分: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比这个答案要好得多。
答案 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)
如果您需要修剪值,您可以在分割后执行此操作。此外,在使用none
处理文本之前,re.sub(r'\b\none\b', 'NONE', input)
可以转为小写。
答案 2 :(得分: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)