2016-03-01 102 views
2

我用這個模式在解析器匹配單引號字符串:Python的正則表達式匹配引用字符串逃過單引號

"'.+?'" 

但我需要的正則表達式,可以發現單引號字符串,如單qoutes逃逸的Postgres (加倍單行)。需要匹配是這樣的:

"'first', 'sec''ond', 't''hi''rd'" 

我想找到該啓動和單一單引號結尾的字符串最短的比賽,所以上面的字符串將意味着3子:

'first' 
'sec''ond' 
't''hi''rd' 
+0

不應該用正則表達式來處理嵌套結構**。 – Maroun

+0

@jurkij爲什麼你在上一個問題中未能接受答案? –

回答

3

當然,'(?:[^']|'')*'是此工作正則表達式:它'隨後以比其他'零個或多個字符或雙' s的尾隨'隨後匹配。

但是,爲了使它更有效率,您可以使用unroll-the-loop technique展開展開

'[^']*(?:''[^']*)*' 

the regex demo並注意它多少步花費的正則表達式查找所有的比賽。

正則表達式可以讀作

  • ' - 匹配'
  • [^']* - 接零個或多個字符以外'
  • (?:''[^']*)* - 然後零或之後具有零或''多個序列除'之外的其他字符
  • ' - 然後匹配尾隨'

這個正則表達式有一個線性模式,涉及儘可能少的回溯。

只是注意:您仍然可以您對目前的情況正則表達式的工作,如果你加,如果有一個,或串的後'後結束先行檢查:

'.+?'(?=,|$) 
    ^^^^^^^ 

regex demo。但是,它與上下文相關,效率低於展開的正則表達式。

2

'(?:[^']|'{2})+'

單引號,隨後的貪婪出現:

  • 任一個字符是不是單引號後跟一個單引號
  • 或兩個單引號一起

演示:https://regex101.com/r/zP2eK6/1

1

爲你提供這應該工作模式:

'[\w']+'

也就是說匹配一個單引號後面跟着一個或多個非空白或單引號接着是最終的單引號。

相關問題