我写使用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