附加到一行

时间:2016-01-13 03:43:25

标签: python regex replace append carriage-return

我有一个字符串fruits

Apples
Bananas
Pineapples

在每一行的末尾以及字符串的开头和结尾都有一个回车符\r。使用RegEx,如何将: 1附加到第一行Apples的末尾?我试过以下无济于事:

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

我的想法是\1应该替换方括号(\r)中的内容,但是模式中的所有内容都会被替换。

3 个答案:

答案 0 :(得分:2)

您正在做的是匹配"Apples\r",在流程中捕获"\r",然后将整个匹配替换为"\r:1"

对于这个简单的示例,无论如何都不需要将匹配项捕获到\r,因为唯一匹配它的是\r。您可以将其硬编码到替换字符串中。

我假设您希望结果字符串为"\rApples: 1\rBananas\rPineapples\r

您可以使用lookbehind,以便{@ 1}}不被消费(虽然我听说每天消耗一个可以让医生远离我):

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

答案 1 :(得分:1)

如果你这样做

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

您将获得BC,因为\1 被括号中的内容替换为

要获得AC,您应该这样做:

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

答案 2 :(得分:0)

将\ r作为水果分隔符会使打印出来变得尴尬;所以为了这个答案的目的,我将在其位置使用@字符。如果将\ r分配给我的分隔符变量并使用实际的\ 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 = "@Apples@Bananas@Pineapples@"
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)

这是代码的输出:

@Apples@Bananas@Pineapples@

@Apples@Bananas@Pineapples:25@
@Apples@Bananas:17@Pineapples:25@
@Apples@Bananas:17@Pineapples:3@
@Apples:94@Bananas:17@Pineapples:3@
@Apples:102@Bananas:17@Pineapples:3@

我正在为目标文本和替换文本构建单独的正则表达式。

这些目标表达式假定每个水果:数量后跟分隔符。目标表达式中有两个捕获组 - 每个捕获组都被括号括起来。第二个分组在目标表达式中很重要,因为它会扫描任何可能存在的数量元素。

替换表达式以\ 1开头,表示与目标表达式中第一个分组匹配的文本(例如“Apples”)。然后是冒号,然后是要使用的数量字符串。这样做可以确保任何现有的:数量被新数量正确替换,并且在没有现有数量的情况下也可以使用。因此,例如在我们的第三次更改中,您会看到Pineapples的数量从25回到3。

随着时间的推移,你需要另一种机制来向fruit_str添加新类型的水果。