2015-04-05 81 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' 
>>>