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 无法首先读取\添加其他! 手动是不可能逃脱的,因为那是一个有很多查询的巨大项目。 有帮助吗?
请您参考如下方法:
下面的正则表达式可以工作
(?<!\\)(?=')
或
(?=(?<!\\)')
如果您的需求像您提到的那样简单,那么您甚至不需要环顾四周。可以简单的写成
[^\\]'
正则表达式不匹配每个引号的原因是因为 python 将 sting 中的 \' 解释为一种转义 ' 的方式,因为在 python 中字符串可以用单引号和双引号表示。所以基本上左边要匹配的字符串是
sasi0'sada1'adad2'theend
这个修改后的字符串不包含任何\'。所以每个 ' 都是匹配的。如果你转义 ' 两次
sasi0'sada1\\'adad2'theend
那么解决方案是什么?
使用原始字符串而不是普通字符串。这可以通过将 r 放在双引号之前的字符串前面来完成
r"sasi0'sada1\'adad2'theend"
