我正在使用ply编写一个需要识别 FORTRAN 字符串文字的解析器。这些用单引号引起来,转义字符是双引号。IE
'I don''t understand what you mean'
是一个有效的转义 FORTRAN 字符串。
Ply 在正则表达式中接受输入。到目前为止,我的尝试不起作用,我不明白为什么。
t_STRING_LITERAL = r"'[^('')]*'"
有任何想法吗?
字符串文字是:
因此,我们的正则表达式是:
r"'(''|[^'])*'"
你想要这样的东西:
r"'([^']|'')*'"
这表示在单引号内可以有双引号或非引号字符。
方括号定义了一个字符类,您可以在其中列出可能匹配或不匹配的字符。它不允许任何比这更复杂的事情,因此尝试使用括号并匹配多字符序列('')
是行不通的。相反,您的[^('')]
字符类相当于[^'()]
,即它匹配任何不是单引号或左括号或右括号的内容。
解析给您带来问题的特定字符串文字通常很容易获得快速而肮脏的东西,但对于一般解决方案,您可以从pyparsing 模块获得非常强大且完整的字符串文字正则表达式:
>>> 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'