在逗号之间选择和替换字符串的正则表达式不包括预期的逗号

时间:2016-11-15 16:53:37

标签: python regex python-3.x

我试图用指定的字符串替换单词二和三。我不明白为什么我的代码不起作用。

import re

string = "one,two,three,"

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

print(string)

返回

aAaAaA

但我希望它返回aA,aA,aA,。我已经尝试了几个不同的命令而没有成功包含逗号。

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

3 个答案:

答案 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)