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