我想知道如何用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?
答案 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 "
答案 2 :(得分:0)
首先,不要将str
用作变量名。它是Python中的保留关键字。
import re
str1 = "aaa bbb ccc"
re.sub("bbb", "111 bbb 222", str1)
Out[11]: 'aaa 111 bbb 222 ccc'