我想用指定的字符串替换一个两个和三个字。我不明白为什么我的代码不起作用。正则表达式选择和替换逗号之间的字符串不包含逗号如预期
import re
string = "one,two,three,"
string = re.sub(r',?(.*?),+','aA', string)
print(string)
返回
aAaAaA
但我想它返回aA,aA,aA,
。我试过几个不同的命令,但没有成功包含逗号。
就我而言,选择应该在括号内,因此逗号不应该被替换。
我想用指定的字符串替换一个两个和三个字。我不明白为什么我的代码不起作用。正则表达式选择和替换逗号之间的字符串不包含逗号如预期
import re
string = "one,two,three,"
string = re.sub(r',?(.*?),+','aA', string)
print(string)
返回
aAaAaA
但我想它返回aA,aA,aA,
。我试过几个不同的命令,但没有成功包含逗号。
就我而言,选择应该在括号内,因此逗号不应该被替换。
可以使用负字符类[^,]+
为正则表达式:
>>> print re.sub(r'[^,]+', 'aA', string)
aA,aA,aA,
[^,]+
将匹配1或更多,是不是一个逗号任意字符。
您可以使用[a-zA-Z] +来匹配和替换字母表中的所有字母。
此代码适用于我;
import re
string = "one,two,three,"
string = re.sub("[a-zA-Z]+","aA",string)
print(string)
为什么我的代码不工作
你把一个字符串,并搜索满足',?(.*?),+'
模式的所有非重叠的子串(零或一个,
,(捕获到组1 )除换行符号以外的任何零个或多个字符,1个或多个逗号),然后将所有这些匹配替换为Aa
。这只是合乎逻辑的,没有逗号,因为他们得到匹配,并且消耗与,+
。
就我而言,选择应该放在括号内,因此逗号不应该被替换。
不,如果你想捕获的组内的任何替代品,你需要使用re.sub
里面的回调方法(或λ),见this rather useless demo只显示功能:
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
替换每个非空块,并加入回来,
,?
因为.*
无论如何都会匹配它,使用.*?(?=,)
与(?=,)
是一个积极的看法,需要存在的逗号,但不会消耗它,即不让它匹配r'.*?(,+)'
特征匹配1个或多个逗号和.*?
只是懒洋洋地匹配任何其他0+比字符换行的,到第一,
捕获组和r'aA\1'
替换将用aA
和保存在组1中的逗号代替整个匹配aA
模式替换所有1+个ASCII字母块(与'[a-z]+'
和flags=re.I
匹配,以使其不区分大小写)。import re
string = "one,two,three,"
res = ",".join(["Aa" if x else "" for x in string.split(",")]) # non-regex way
print(res)
print(re.sub(r'.*?(?=,)',r'aA', string)) #regex: fixed version
print(re.sub(r'.*?(,+)',r'aA\1', string)) #regex: capturing and backreferences
print(re.sub(r'[a-z]+',r'aA', string, flags=re.I)) # a very simple, shortest possible working regex
@Clone:难道这项工作呢? – anubhava