Skip to main content
 首页 » 编程设计

python之正则表达式不获取转义引号

2025年04月02日36lautakyan007

python中的示例字符串是"sasi0'sada1\'adad2'theend"

我想要不转义的单引号,所以应该选择 0 和 2 之后的引号,而不是 1 之后的引号。

我尝试了 re.findall(r"[\d]'") 但我得到了所有树引号 有帮助吗?

让我告诉你真实的场景! 我正在编写一个脚本来从代码中提取 sql 查询。 perl代码:

ad.pl:$query = "Select *  from (Select ((select cast(sysdate as ts) from dual)||(select c_r from v\$r_limit where r_n=\'sessions\')||\',\'||(select c_u  from v\$r_l where r_n=\'t\')) as \"D,B,HH,AS,CT\" from dual)";  

正则表达式:

re.compile(r'''(('|")(insert |update |delete |select )(.*?)(?<!\)(\2)(;?))''',re.IGNORECASE) 

但是后向引用捕获了转义的双引号。 所以只得到一半的查询

我不认为我可以自动添加额外的反斜杠来转义它,因为 python 无法首先读取\添加其他! 手动是不可能逃脱的,因为那是一个有很多查询的巨大项目。 有帮助吗?

请您参考如下方法:

下面的正则表达式可以工作

(?<!\\)(?=') 

或

(?=(?<!\\)') 

Ideone Demo

如果您的需求像您提到的那样简单,那么您甚至不需要环顾四周。可以简单的写成

[^\\]' 

正则表达式不匹配每个引号的原因是因为 python 将 sting 中的 \' 解释为一种转义 ' 的方式,因为在 python 中字符串可以用单引号和双引号表示。所以基本上左边要匹配的字符串是

sasi0'sada1'adad2'theend 

这个修改后的字符串不包含任何\'。所以每个 ' 都是匹配的。如果你转义 ' 两次

sasi0'sada1\\'adad2'theend 

那么解决方案是什么?

使用原始字符串而不是普通字符串。这可以通过将 r 放在双引号之前的字符串前面来完成

r"sasi0'sada1\'adad2'theend"