2016-04-26 62 views
2

在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

'= \'............... –

+0

'(?<!\\)(?=')'.. – rock321987

+0

@ rock321987我试过了您的建议,但仍然得到所有报价 – sasidhar513

回答

1

以下的正则表达式将工作

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

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

Ideone Demo

如果你的要求是你所说的那么简单,那么你甚至不需要环视四周。它可以简单地写为

[^\\]' 

原因正则表达式的每个引号不匹配是因为python被解释\'内刺痛的方式来逃避'因为在Python字符串可以通过单引号和双引号来表示。所以基本上要匹配的字符串左边是

sasi0'sada1'adad2'theend 

enter image description here

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

sasi0'sada1\\'adad2'theend 

有什么解决办法呢?

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

r"sasi0'sada1\'adad2'theend" 
+0

谢谢你。我已经延长了这个问题!请看一看!我们是否可以自动添加额外的反斜杠,当我们得到单反斜杠后跟'或“ – sasidhar513

+0

@ sasidhar513只在'''或'''之前表示? – rock321987

+0

是的,我猜。这是实际的代码不能添加不必要的反斜杠!我试图添加,但失败了! – sasidhar513

0

\'在这种情况下\充当逃逸'之前完成,所以你需要躲避'\'以及这样\\'

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

谢谢你。我已经延长了这个问题!请看一看!我们可以自动添加额外的反斜杠,当我们得到单反斜线后跟'或“ – sasidhar513

0

这一个似乎是为我工作。 \w((?<!\\)([\w']+))