我寫使用ply需要識別FORTRAN字符串字面量的分析器。這些引用帶有單引號的轉義字符加倍單引號。即如何編寫正則表達式來匹配字符串文字,其中escape是引號字符的兩倍?
'I don''t understand what you mean'
是一個有效的轉義FORTRAN字符串。
簾布層需要輸入在正則表達式。到目前爲止我的嘗試不起作用,我不明白爲什麼。
t_STRING_LITERAL = r"'[^('')]*'"
任何想法?
我寫使用ply需要識別FORTRAN字符串字面量的分析器。這些引用帶有單引號的轉義字符加倍單引號。即如何編寫正則表達式來匹配字符串文字,其中escape是引號字符的兩倍?
'I don''t understand what you mean'
是一個有效的轉義FORTRAN字符串。
簾布層需要輸入在正則表達式。到目前爲止我的嘗試不起作用,我不明白爲什麼。
t_STRING_LITERAL = r"'[^('')]*'"
任何想法?
一個文本字符串是:
因此,我們的正則表達式是:
r"'(''|[^'])*'"
你想是這樣的:
r"'([^']|'')*'"
這是說單引號內,你可以有雙引號或非報價字符。
括號定義了一個字符類,您可以在其中列出可能匹配或不匹配的字符。它不允許任何比這更復雜的事情,所以嘗試使用括號並匹配多字符序列('')
不起作用。相反,你的[^('')]
字符類相當於[^'()]
,即它匹配任何東西,這不是一個單引號或左或右括號。
它通常是很容易得到的東西快速和骯髒的解析這是給你的問題,特別是字符串常量,但是對於一般的解決方案,您可以從pyparsing module字符串字面量一個非常強大和完整的正則表達式:
>>> import pyparsing
>>> pyparsing.quotedString.reString
'(?:"(?:[^"\\n\\r\\\\]|(?:"")|(?:\\\\x[0-9a-fA-F]+)|(?:\\\\.))*")|(?:\'(?:[^\'\\n\\r\\\\]|(?:\'\')|(?:\\\\x[0-9a-fA-F]+)|(?:\\\\.))*\')'
我不確定FORTRAN的字符串文字和Python的顯着區別,但是如果沒有別的,它是一個方便的參考。
import re
ch ="'I don''t understand what you mean' and you' ?"
print re.search("'.*?'",ch).group()
print re.search("'.*?(?<!')'(?!')",ch).group()
結果
'I don'
'I don''t understand what you mean'
阿正則表達式的禪,謝謝! – Brendan 2010-01-26 22:47:48
這似乎不處理轉義序列。 – Cyoce 2016-04-07 19:16:18