我是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);
答案 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