将字符插入字符串到数字末尾
Insert char to string to end of number
我的字符串很难看:
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'|', oldstr.lower())
0.|100%| fdrg: 2%|,dgdv: 29%| fgd dg 0.|2%|, ghh-sf 2.|2 |dbgh: none dfgdf6 |gd 3 |
任何帮助将不胜感激。
怎么样:
>>> re.sub(r"([\d\.]+|NONE)%?", r"|", oldstr)
'0.100| fDrg: 2|,dgdv: 29| fGd dg 0.2|, Ghh-sf 2.2| dbgh: NONE| dfgdf6| gd 3| '
这里我们捕获一个或多个数字和点或 capturing group 中的 NONE
(后跟一个可选的 %
符号)并将其替换为自身和一个管道字符。
请注意 比这个答案要好得多。
你可以使用
(\bnone\b|\d+(?:\.\d+)?)%?
并替换为|
。
解释:
(\bnone\b|\d+(?:\.\d+)?)
- 第 1 组匹配 2 个备选方案:
\bnone\b
- 整个单词 none
|
- 或...
\d+(?:\.\d+)?
- 浮点值(\d+
匹配一个或多个数字,(?:\.\d+)?
匹配(可选)一个点后跟一个或多个数字)
%?
- 可选(因为 ?
表示 匹配一次或零次 ) %
符号
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 = "|"
result = re.sub(p, subst, test_str)
如果需要trim值,拆分后即可。此外,在使用 re.sub(r'\b\none\b', 'NONE', input)
.
处理文本之前,可以将 none
变为小写
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"|", 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|
稍微思考一下这里是one-liner:
print re.sub(r"([\.\d'NONE']+)%?", r"|", oldstr)
我的字符串很难看:
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'|', oldstr.lower())
0.|100%| fdrg: 2%|,dgdv: 29%| fgd dg 0.|2%|, ghh-sf 2.|2 |dbgh: none dfgdf6 |gd 3 |
任何帮助将不胜感激。
怎么样:
>>> re.sub(r"([\d\.]+|NONE)%?", r"|", oldstr)
'0.100| fDrg: 2|,dgdv: 29| fGd dg 0.2|, Ghh-sf 2.2| dbgh: NONE| dfgdf6| gd 3| '
这里我们捕获一个或多个数字和点或 capturing group 中的 NONE
(后跟一个可选的 %
符号)并将其替换为自身和一个管道字符。
请注意
你可以使用
(\bnone\b|\d+(?:\.\d+)?)%?
并替换为|
。
解释:
(\bnone\b|\d+(?:\.\d+)?)
- 第 1 组匹配 2 个备选方案:\bnone\b
- 整个单词none
|
- 或...\d+(?:\.\d+)?
- 浮点值(\d+
匹配一个或多个数字,(?:\.\d+)?
匹配(可选)一个点后跟一个或多个数字)
%?
- 可选(因为?
表示 匹配一次或零次 )%
符号
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 = "|"
result = re.sub(p, subst, test_str)
如果需要trim值,拆分后即可。此外,在使用 re.sub(r'\b\none\b', 'NONE', input)
.
none
变为小写
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"|", 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|
稍微思考一下这里是one-liner:
print re.sub(r"([\.\d'NONE']+)%?", r"|", oldstr)