2016-01-18 8 views
2

У меня есть уродливая строка:Вставить символ в строку в конец числа

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

I нужно, чтобы вставить символ | после последней цифры номера для следующего расщепления по этим вставленному |. Там не также значение 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

Самое худшее, что вы, кажется, подбирайте значение, которое приходит после того, как целое число. Вам это действительно нужно? Кроме того, я не вижу простого способа превратить «нет» в строчный. Проверьте ['(\ 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) 

Если вам нужно обрезать значения, вы сможете сделать это после разделения. Кроме того, none можно перевернуть в нижнем регистре перед обработкой текста с помощью re.sub(r'\b\none\b', 'NONE', input).

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| ' 

Здесь мы захватывая один или несколько вхождений цифр и точек или NONE в capturing group (с последующим дополнительным % знаком) и заменить его с собой и характер трубы.

Обратите внимание, что @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) 

 Смежные вопросы

  • Нет связанных вопросов^_^