【发布时间】:2022-01-22 05:08:39
【问题描述】:
我正在尝试替换正则表达式组的环境。我想用 LLL 和 MMM 替换 QQQQQ 和 SSSSS,中间的东西,前后保持不变。 (QQQQQ 和 SSSSS 可能会多次出现)。
在下面的代码中,(1) 似乎显示.*? 可以找到正确的字符串。
但在 (2) 中,使用(.*?) 作为一个组也能找到正确的字符串,但在替换中得到一个0。
在 (3) 和 (4) 中,DOTALL 没有找到任何字符串。
我在这里使用正则表达式,但它与 re 相同。我也试过 $1 而不是 \1
代码如下:
doc1 = """AAA QQQQQ azertyuiop SSSSS BBB"""
doc2 = """
AAA
QQQQQ
azertyuiop
SSSSS
BBB
"""
# (1) OK - gives AAA LLL dd MMM BBB. .*? finds the right string
doc = regex.sub("QQQQQ.*?SSSSS", "LLL dd MMM", doc1)
print(doc)
# (2) gives AAA LLL ☺ MMM BBB - where does this ☺ come from?
doc = regex.sub("QQQQQ(.*?)SSSSS", "LLL \1 MMM", doc1)
print(doc)
# (3) leaves string unchanged. Isn't DOTALL supposed to match line breaks?
doc = regex.sub("QQQQQ.*?SSSSS", "LLL dd MMM", doc2, regex.DOTALL)
print(doc)
# (4) leaves string unchanged
doc = regex.sub("QQQQQ(.*?)SSSSS", "LLL \1 MMM", doc2, regex.DOTALL)
print (doc) # leaves unchanged
(4) 是我正在尝试做的事情
【问题讨论】:
-
对正则表达式使用原始字符串。否则
\1表示代码为1的字符,而不是反向引用。 -
原始字符串:这使得 (2) 工作。但是(3)和(4)仍然没有......
-
您需要
flags=regex.DOTALL。regex.sub()的第四个位置参数是count,而不是flags。 -
@Barmar
flags=regex.DOTALL这就是答案。 @downvoters:提供的链接没有回答问题。如果您已经知道问题与原始字符串有关,那么它仅与问题的前半部分相关,并且如果您知道,那么您已经解决了问题。它没有提到 DOTALL。 -
您问了多个问题。该链接解释了为什么
\1在案例 2 中不起作用。