re.sub符号的差异

2024-06-10 16:27:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用re.sub时有点犯了错误,因为它与所有其他python re函数/方法的转义方式似乎有所不同。例如,以下表达式:

>>> re.sub(r'\smd:', r'\s', '<tag md:new>text</tag>')

我想会有回报:<tag new>text</tag>

实际返回:

<tag\snew>text</tag>

\s未被替换的情况下。原始字符串(^ {CD5}})不能在中间(^ {CD6}})ARG中工作吗?是否有一些关于如何使用的指南

在对它进行了一些尝试和错误之后,使用re.sub的方法似乎是“捕获”空间并将其作为替代品传递回去:

>>> re.sub(r'(\s)md:', r'\1', '<tag md:new>text</tag>')
'<tag new>text</tag>'

Tags: 方法函数字符串textrenew表达式tag
2条回答

在对re.sub的调用中,第一个参数r'\smd:'应该是原始字符串,因为您希望正则表达式引擎解析\,而不是Python。然而,第二个参数r'\s'不需要是原始字符串,因为它不会被正则表达式引擎解析,但是您希望告诉Python它应该是一个空格,所以您可以传递它' '

因此,这将起作用:

re.sub(r'(\s)md:', ' ', '<tag md:new>text</tag>')

另一件需要注意的事情是,您现在正在将' md:'替换为' ',但是如果前面有空格,您可以将'md:'替换为'',这样做的好方法是:

re.sub(r'(?<=\s)(md:)', '', '<tag md:new>text</tag>')

它并没有那么短,但它非常清楚您实际在做什么,并且在其他情况下会更好地工作,您知道之前的内容,但不能仅仅替换它。这被称为regex lookbehind表达式-并非所有引擎都支持它,但Python 3的re目前支持它

\s是一个字符(空白),因此不清楚引擎希望用哪个字符替换匹配项。只需使用空格()即可:

>>> re.sub(r'\smd:', r' ', '<tag md:new>text<tag>')
'<tag new>text<tag>'

相关问题 更多 >