为什么 Python re.escape() 转义"#"字符?



阅读re.escape()文档,它说

在3.3版更改:'_'字符不再转义。

在3.7版更改:只有在正则表达式中具有特殊含义的字符才会被转义。结果,"!"、" ;', '%', & "" ;, ',', '/', ':', ';', '& lt ;', '=', '& gt;"、"@","">

问题是,为什么#字符仍然转义?

当使用re.X/re.VERBOSE选项时,#字符变得特殊(与任何文字空白一样)。

检查下面的代码片段:

import re
pattern = "# Something"
text = "Here is # Something"
print( re.search(pattern, text ) )
# => <re.Match object; span=(8, 19), match='# Something'>
print( re.search(pattern, text, re.X ) )
# => <re.Match object; span=(0, 0), match=''>

查看Python演示。

当使用re.search(pattern, text, re.X )时,没有匹配,因为# Something被解析为注释,#标记单行注释开始,在它之后直到换行符的所有文本在模式中被忽略。

因此,re.escape转义#,然后当使用re.X/re.VERBOSE时,它被视为字面值字符:

print( re.search(re.escape(pattern), text, re.X ) )
# => <re.Match object; span=(8, 19), match='# Something'>

最新更新