2016-01-13 1 views
2

у меня есть определенная строка fruits как таковые:добавления в линию

Apples 
Bananas 
Pineapples 

Существует возврат каретки \r в конце каждой строки, а также в начале и в конце строки. Используя RegEx, как я могу добавить добавление : 1 в конец первой строки Apples? Я попытался следующие без толку:

re.sub("Apples(\r)", "\1:1", fruits) 

Мое мышление было то, что \1 должен заменить то, что в скобках (\r), однако все в шаблоне заменяется.

ответ

2

Вы делаете именно то, что подходит "Apples\r", снимая "\r", а затем заменяя весь матч на "\r:1".

Для этого простого примера нет необходимости фиксировать совпадения с \r, так как единственное, что будет соответствовать, это \r. Вы можете записать код в строку замены.

Предполагаю, что итоговая строка должна быть "\rApples: 1\rBananas\rPineapples\r.

Вы можете использовать lookbehind так, что Apples не расходуется (хотя я слышал, что потребление один день держит доктора):

re.sub("(?<=Apples)\r", ": 1\r", fruits) 

Но вы можете просто сделать:

re.sub("Apples\r", "Apples: 1\r", fruits) 

Lookbehind был бы более полезен, если бы вы хотели добавить : 1 после каждого фрукта:

re.sub("(?<=[^\r])\r", ": 1\r", fruits) 

Вышеупомянутый говорит, что каждый \r следует за персонажем, который не является \r, и заменяет их : 1\r. Результат будет таким:

# \rApples: 1\rBananas: 1\rPineapples: 1\r\r 
1

Если вы

re.sub("A(B)", "\1C", "AB") 

вы получите BC, потому что \1заменяется тем, что находится в скобках.

Чтобы получить AC, вы должны сделать:

re.sub("(A)B", "\1C", "AB") 
0

Имея \ г, как плод ваш сепаратор делает неудобным печатать вещи; поэтому для целей этого ответа я собираюсь использовать символ @ на своем месте. Следующий код работает одинаково, если вы присваиваете переменной \ r моей разделительной переменной и используете вашу фактическую разделенную строку для fruit_str.

Некоторые объяснения следует за кодом.

import re 

def updateFruitQuantity(the_fruit, the_quantity, fruit_str, separator): 
    re_1 = r"(" + the_fruit + r")(:.*?|)" + separator 
    re_2 = r'\1:' + str(the_quantity) + separator 
    fruit_str = re.sub(re_1, re_2, fruit_str) 
    return(fruit_str) 

separator = "@" 
fruit_str = "@[email protected]@[email protected]" 
print(fruit_str) 

fruit_str = updateFruitQuantity("Pineapples", 25, fruit_str, separator) 
print(fruit_str) 
fruit_str = updateFruitQuantity("Bananas", 17, fruit_str, separator) 
print(fruit_str) 
fruit_str = updateFruitQuantity("Pineapples", 3, fruit_str, separator) 
print(fruit_str) 
fruit_str = updateFruitQuantity("Apples", 94, fruit_str, separator) 
print(fruit_str) 
fruit_str = updateFruitQuantity("Apples", 102, fruit_str, separator) 
print(fruit_str) 

А вот выход Кодекса:

@[email protected]@[email protected] 

@[email protected]@Pineapples:[email protected] 
@[email protected]:[email protected]:[email protected] 
@[email protected]:[email protected]:[email protected] 
@Apples:[email protected]:[email protected]:[email protected] 
@Apples:[email protected]:[email protected]:[email protected] 

Я строй отдельных регулярных выражений для целевого текста и текст замены.

Эти целевые выражения предполагают, что каждое количество фруктов: количество сопровождается разделителем. В целевом выражении есть две группы захвата - каждая из них окружена скобками. Вторая группировка важна в целевом выражении, поскольку она подбирает любой элемент количества, который может присутствовать.

Заменное выражение начинается с \ 1, который обозначает текст, сопоставляемый первой группировкой в ​​целевом выражении (например, «Яблоки»). Затем следует двоеточие, а затем строка количества, которая будет использоваться. Выполнение этого способа гарантирует, что любое существующее: количество должным образом заменяется новым количеством и что оно также работает в случае, когда не было существующего количества. Так, например, в нашем третьем изменении вы увидите, что количество ананасов возвращается с 25 до 3.

Вам понадобится еще один механизм добавления новых фруктов в fruit_str по прошествии времени.

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