Python如果条件在re.sub

时间:2017-03-29 11:00:08

标签: python regex

我是python中的新手,我想在re.sub中使用我的正则表达式。我在regex101上尝试了它并且它有效。不知怎的,当我试图在我的python(版本3.6)上使用它时,它无法正常工作。我收到以下警告

  

组名中的错误字符'?= [^ \ t] *'位于第5位

这是我的代码:

re = r"(?(?=[^\t]*)([\t]+))";
str = 'a            bold, italic,           teletype';
subst = ',';

result = re.sub($re, $subst, $str);

2 个答案:

答案 0 :(得分:1)

我想你可以这样做:

import re

regex = r'(^\w*?[\t]+)'
s = 'a      bold, italic,           teletype'

def repl(match):
    s = match.group(0)
    return s.rstrip() + ', '

print(re.sub(regex,repl, s))

a, bold, italic,            teletype

这里我们通过在第一个单词之后可能出现的任何选项卡捕获字符串的开头,并将匹配传递给callable。 callable使用rstrip删除尾随标签,并添加一个尾随逗号。

注意:如果第一个标签出现在第一个单词之后,则不会被替换。即'a bold, italic, teletype'保持不变。这就是你想要的吗?

答案 1 :(得分:1)

问题是你不能在Python re中的条件结构中使用外观。仅捕获组ID以测试前一组是否匹配。

  

<强> (?(id/name)yes-pattern|no-pattern)
  如果具有 id 或名称的组存在,则尝试与yes-pattern匹配,如果不存在,则尝试与no-pattern匹配。 no-pattern是可选的,可以省略。

(?(?=[^\t]*)([\t]+))正则表达式检查当前位置是否有超过标签的0 +字符,如果是,则匹配并捕获1个或多个标签。这毫无意义。如果您想匹配第一个出现的1个或多个标签,则可以re.sub仅使用"\t+"模式和count=1参数。

import re
reg = "\t+";
s = 'a          bold, italic,           teletype';
result = re.sub(reg, ',', s, count=1);
print(result);

请参阅Python demo