2016-11-15 90 views
1

我想用指定的字符串替换一个两个和三个字。我不明白为什么我的代码不起作用。正则表达式选择和替换逗号之间的字符串不包含逗号如预期

import re 

string = "one,two,three," 

string = re.sub(r',?(.*?),+','aA', string) 

print(string) 

返回

aAaAaA 

但我想它返回aA,aA,aA,。我试过几个不同的命令,但没有成功包含逗号。

就我而言,选择应该在括号内,因此逗号不应该被替换。

回答

0

可以使用负字符类[^,]+为正则表达式:

>>> print re.sub(r'[^,]+', 'aA', string) 
aA,aA,aA, 

[^,]+将匹配1或更多,是不是一个逗号任意字符。

+0

@Clone:难道这项工作呢? – anubhava

0

您可以使用[a-zA-Z] +来匹配和替换字母表中的所有字母。

此代码适用于我;

import re 

string = "one,two,three," 

string = re.sub("[a-zA-Z]+","aA",string) 

print(string) 
1

为什么我的代码不工作

你把一个字符串,并搜索满足',?(.*?),+'模式的所有非重叠的子串(零或一个,,(捕获到组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匹配,以使其不区分大小写)。

Python demo

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 
相关问题