2015-04-05 30 views
1

我目前使用(['\"])(?:\\1|.*?\\1)来捕获引号组。群组引号并忽略转义引号

Text: "Hello", is it 'me youre looking for'? 
# result: "Hello" (\1) and 'me youre looking for' (\2) 

此外,我希望它忽略这些组内(或全球性,也罚款)逃脱报价。

Text: "Hello", is it 'me you\'re looking for'? 
# result: "Hello" (\1) and 'me you\'re looking for' (\2) 

使用python。我知道this questions有点类似。但是,我无法将其应用于现有的正则表达式。

谢谢,正则表达式的怪胎!

回答

3

这里有一个规律:

(['"])(?:\\.|.)*?\1 

Demo

Everyting在于(?:\\.|.)位:

  • 要么匹配一个转义字符:\\. - 这同时处理\"\\
  • 或任何其他(重新)广告:未转义)字符:. - 您也可以在此处使用[^\\]

由于正则表达式引擎会尝试从左到右的变化,因此它会先尝试匹配转义字符。

顺便说一下,在你的模式下,\1|.*?\1是多余的,你可能只写了.*?\1

0

你可以使用下面的正则表达式。

(?<!\\)(['"])(?:\\\1|(?!\1).)*\1 

DEMO

它断言匹配将不受反斜线字符preceeded
  • (?<!\\)负回顾后发。

  • (['"])这将捕获未转义的单引号或双引号。

  • (?:\\\1|(?!\1).)*\\\1这将匹配基于所捕获的字符或任何字符,但不拍摄的性格,零次或多次转义'"报价。

  • \1指的是第一个被捕获的角色。

在python中,你需要改变如下所示的re.findall函数。

>>> def match(s): 
     for i in re.findall(r'''(?<!\\)((['"])(?:\\\2|(?!\2).)*\2)''', s): 
      print(i[0]) 


>>> match(r""""Hello", is it 'me you\'re looking for'""") 
"Hello" 
'me you\'re looking for' 
>>> match(r"""Hello\", is it 'me you\'re looking for'""") 
'me you\'re looking for' 
>>>