我有一个字符串fruits
:
Apples
Bananas
Pineapples
在每一行的末尾以及字符串的开头和结尾都有一个回车符\r
。使用RegEx,如何将: 1
附加到第一行Apples
的末尾?我试过以下无济于事:
re.sub("Apples(\r)", "\1:1", fruits)
我的想法是\1
应该替换方括号(\r)
中的内容,但是模式中的所有内容都会被替换。
答案 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添加新类型的水果。