Python正则表达式将组1替换为某个字符串

时间:2017-03-11 11:52:17

标签: python regex

我想知道如何用python中的regex替换组1和某些字符串。

问题1:

str = "aaa bbb ccc"
regex = "\baaa (bbb)\b"
repl = "111 bbb 222"

使用正则表达式匹配str,匹配“aaa bbb”,并将group1“bbb”替换为“111 bbb 222”,并获得结果“aaa 111 bbb 222 ccc”

str_repl = "aaa 111 bbb 222 ccc"

感谢@RomanPerekhrest和@janos的lookbehind方法。

我想知道如何解决更一般的情况:

问题2:

s1 = "bBb"
regex = "(?<=\baaa )" + s1 + "\b"  # may not suitable
repl = "XxX " + s1 + " YyY"

目标:

s0 = "aaa bBb ccc"
s0_repl = "aaa XxX bBb YyY ccc"

s1 = "aaa bbb ccc"
no match

s2 = "AAA bBb ccc"
s2_repl = "AAA XxX bBb YyY ccc"

在原始字符串中匹配时,忽略除s1之外的子字符串的大小写。

问题3:

s1 = "bbb"
regex = "(?<=\baaa )" + s1 + "\b"  # may not suitable
repl = "XxX " + s1 + " YyY"

目标:

s0 = "aaa bBb ccc"
s0_repl = "aaa XxX bBb YyY ccc"

s1 = "aaa bbb ccc"
s1_repl = "aaa XxX bbb YyY ccc"

s2 = "AAA BBB ccc"
s2_repl = "AAA XxX BBB YyY ccc"

在匹配&amp;时忽略除s1之外的子字符串的情况用原始字符串代替。

问题4:

如果有办法用python上的regex替换原始字符串上的组1?

3 个答案:

答案 0 :(得分:1)

您可以使用re套餐和正面观察:

import re
s = "aaa bbb ccc"
regex = r"\b(?<=aaa )(bbb)\b"
repl = "111 bbb 222"
print(re.sub(regex, repl, s))

这将产生:

aaa 111 bbb 222 ccc

请注意我在那里所做的更改:

  • 正则表达式中的aaa前缀包含在(?<=...)中。这意味着,如果bbb跟随aaa,则匹配aaa,而不在要替换的模式中包含aaa。这称为positive lookbehind。如果没有对您的正则表达式进行此更改,bbb将与r"..."
  • 一起消失
  • 正则表达式字符串应写为str,以使其成为原始字符串,以避免转义序列出现问题
  • 我将s变量重命名为str,因为{{1}}是Python中的保留字,正如@elena所指出的那样。

答案 1 :(得分:1)

要替换应在序列bbb之前的序列aaa,请使用以下方法:

s = "aaa bbb ccc"
regex = r"(?<=aaa )bbb\b"
repl = "111 bbb 222"

str_replaced = re.sub(regex, repl, s)
print(str_replaced)

输出:

aaa 111 bbb 222 ccc

(?<=aaa ) - 后瞻性肯定断言,确保"bbb"前面有"aaa "

http://www.regular-expressions.info/lookaround.html

答案 2 :(得分:0)

首先,不要将str用作变量名。它是Python中的保留关键字。

import re

str1 = "aaa bbb ccc"
re.sub("bbb", "111 bbb 222", str1)
Out[11]: 'aaa 111 bbb 222 ccc'