附加到一行

Appending to a line

我有一个字符串 fruits 是这样的:

Apples
Bananas
Pineapples

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

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

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

你做的是匹配"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)

如果您想在每个水果后添加 : 1,lookbehind 会更有用:

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

上面说找到每个 \r 后面的字符不是 \r,并将它们替换为 : 1\r。结果将是:

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

如果你这样做

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

你会得到 BC,因为 </code> <em> 被 </em> 替换为括号中的内容。</p> <p>要获得 <code>AC,您应该这样做:

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

将 \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':' + 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@

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

这些目标表达式假定每个 fruit:quantity 后跟分隔符。目标表达式中有两个捕获组——每个都被括号括起来。第二个分组在目标表达式中很重要,因为它清除了可能存在的任何 :quantity 元素。

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

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