2017-06-15 92 views
0

我目前正在編寫我自己的語言,並有幾個不同類型的字符串文字,使用3個不同的符號來表示它們。他們在下面。正則表達式來匹配字符串文字

1)"Hello"是一個簡單的字符串文字,編譯爲Hello

2)'Hello'是一個壓縮字符串,用於訪問字符串壓縮函數。 (這將返回亂碼)

3)`Hello`返回從每個字符代碼點

我試圖使用正則表達式來匹配像

`Hel"lo` 2* "Hel`lo" 

一段代碼構成的數量,但不能來只有當第一個和最後一個字符相同時才匹配。我目前有

[`'\"]([\s\S]+|[^`'\"]+)['`\"] 

但這並不會產生我想要的結果。

的例子預期的結果應該是

['`Hel"lo`', ' ', '2', '*', ' ', '"Hel`lo"'] 

但我的正則表達式返回

['`Hel"lo` 2* "Hel`lo"'] 

在你猜不透的情況下,我在正則表達式有點缺乏經驗,所以我會很感激任何幫助。

+1

我假設這在Python正則表達式引擎中是一樣的,但是在一般的正則表達式中,可以使用'\ N'將表達式中稍後與匹配的括號和引用組合在一起,其中'N'是組號。所以像'([\'\「])。* \ 1'這樣的東西就會匹配'」test「'而不是''test'',因爲結尾與第一組沒有相同的匹配。 –

+0

@cairdcoinheringaahing它需要一個捕獲組捕獲,所以你可以做'\ 1'來匹配那個捕獲組匹配的相同字符 – Artyer

+0

@JonathanKuhn我已經嘗試過're.findall'在Python上的正則表達式和''「測試「,但它只是返回'[''']'(它只匹配第一個字符) –

回答

2

使用捕獲組是沒有必要的,你可以簡單地寫你的模式是這樣的:每個報價

`[^`]*`|"[^"]*"|'[^']*'|\w+|\s+|[^`"'\s\w] 

一種替代方法。

demo

+0

你必須逃避''',但它似乎工作,否則 –

+0

@cairdcoinheringaahing:如果你使用''''來附上你的模式字符串,你不必逃脫任何東西。 –

1

如果你只是想獲得第一定界符最接近相同的尾隨分隔符間的內容,你可以使用

import re 
s = """`Hel"lo` 2* "Hel`lo\"""" 
print([x.group(2) for x in re.finditer(r"([\"'`])(.*?)\1", s)]) 

Python demo

詳細

  • ([\"'`]) - 第1組相匹配的雙,單引號或反引號
  • (.*?) - 組2捕獲任何0+字符,儘可能少,高達
  • \1第一次出現 - 相同的值保持在組1(\1是對組1值的反向引用)。