我试图用指定的字符串替换单词二和三。我不明白为什么我的代码不起作用。
import re
string = "one,two,three,"
string = re.sub(r',?(.*?),+','aA', string)
print(string)
返回
aAaAaA
但我希望它返回aA,aA,aA,
。我已经尝试了几个不同的命令而没有成功包含逗号。
就我而言,选择应该在括号内,因此不应该用逗号代替。
答案 0 :(得分:1)
为什么我的代码不起作用
您接受一个字符串并搜索符合',?(.*?),+'
模式的所有非重叠子字符串(零或一个,
,(捕获到第1组)除线以外的任何零个或多个字符中断符号,1个或多个逗号),然后将所有这些匹配替换为Aa
。只有逻辑没有逗号,因为它们与,+
匹配并消费。
就我而言,选择应该在括号内,因此不应该用逗号代替。
不,如果你想在捕获的组中进行任何替换,你需要在{(1}}内部使用回调方法(或lambda),请参阅this rather useless demo仅显示功能:
re.sub
还有其他方法可以满足您的需求,即使是非正则表达式。
import re
def repl(m):
return "{0}{1}{2}".format(m.group(1), re.sub(r'\w+', 'Aa', m.group(2)), m.group(3))
string = "one,two,three,"
print(re.sub(r'(,?)(.*?)(,+)',repl, string))
print(re.sub(r'(,?)(.*?)(,+)', lambda m: "{0}{1}{2}".format(m.group(1), re.sub(r'\w+', 'Aa', m.group(2)), m.group(3)), string))
分开,并使用,
替换每个非空广告块并与Aa
,
,因为,?
无论如何都会匹配它,使用.*
.*?(?=,)
是需要存在的正面预测逗号,但不消耗它,即不使其成为匹配的一部分(?=,)
具有匹配1个或多个逗号的捕获组,而r'.*?(,+)'
只是懒惰地匹配除了换行符之外的任何0 +字符,直到第一个.*?
}和,
替换将替换整个匹配r'aA\1'
和保存在组1中的逗号aA
模式替换所有1个以上的ASCII字母块(与'[a-z]+'
和flags=re.I
匹配,以使其不区分大小写)。请参阅Python demo:
aA
答案 1 :(得分:0)
您可以使用负字符类[^,]+
作为正则表达式:
>>> print re.sub(r'[^,]+', 'aA', string)
aA,aA,aA,
[^,]+
将匹配任何不是逗号的字符中的一个或多个。
答案 2 :(得分:0)
您可以使用[a-zA-Z] +来匹配和替换字母表中的所有字母。
这段代码对我有用;
import re
string = "one,two,three,"
string = re.sub("[a-zA-Z]+","aA",string)
print(string)