正则表达式没有得到逃脱的报价

时间:2016-04-26 09:29:35

标签: python regex escaping

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无法读取\首先添加其他! 手动它是不可能逃脱的,因为那个庞大的项目有很多查询。 有什么帮助吗?

3 个答案:

答案 0 :(得分:1)

以下正则表达式将起作用

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

[^\\]'

<强> Ideone Demo

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

python

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

\'

enter image description here

此修改后的字符串不包含任何'。所以每个'都匹配。如果你以sasi0'sada1\\'adad2'theend 两次逃避

r

那么解决方案是什么?

使用原始字符串而不是普通字符串。这可以通过在双引号

之前将r"sasi0'sada1\'adad2'theend" 放在字符串前面来完成
apt-get install libdb-dev

答案 1 :(得分:0)

在这种情况下,{p> \' \充当'的转义符,因此您需要像'\'一样转义\\'

re.findall(r"[^\\]'","sasi0'sada1\\'adad2'theend")
 ["0'", "2'"]

答案 2 :(得分:0)

这个似乎对我有用。 \w((?<!\\)([\w']+))