将char插入字符串以结束数字

时间:2016-01-18 14:41:50

标签: python regex string insert separator

我有丑陋的字符串:

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 |

任何帮助将不胜感激。

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)