如何编写正则表达式匹配转义字符为引号重复的字符串文字?
我正在用 ply 写一个解析器,目的是识别 FORTRAN 的字符串字面量。这些字符串是用单引号括起来的,转义字符是两个单引号,也就是说:
'I don''t understand what you mean'
这是一个有效的转义 FORTRAN 字符串。
Ply 接受正则表达式作为输入。我目前的尝试没有成功,我也不明白为什么。
t_STRING_LITERAL = r"'[^('')]*'"
有没有什么想法?
4 个回答
1
通常来说,处理一些特定的字符串时,我们可以很快找到简单粗暴的方法来解析它们,但如果想要一个通用的解决方案,可以使用一个非常强大且完整的正则表达式来处理字符串,这个正则表达式来自pyparsing模块:
>>> import pyparsing
>>> pyparsing.quotedString.reString
'(?:"(?:[^"\\n\\r\\\\]|(?:"")|(?:\\\\x[0-9a-fA-F]+)|(?:\\\\.))*")|(?:\'(?:[^\'\\n\\r\\\\]|(?:\'\')|(?:\\\\x[0-9a-fA-F]+)|(?:\\\\.))*\')'
我不太确定FORTRAN的字符串和Python的字符串之间有什么显著的区别,但如果没有其他参考,这个模块还是很有用的。
4
你想要的效果是这样的:
r"'([^']|'')*'"
这段话的意思是,在单引号里面,你可以放双引号或者其他不是引号的字符。
方括号定义了一个字符类,在这个字符类里,你可以列出可能匹配的字符。它不允许更复杂的匹配方式,所以如果你尝试用括号来匹配多个字符的组合 ('')
是不行的。相反,你的 [^('')]
字符类实际上等同于 [^'()]
,也就是说,它匹配任何不是单引号或者左括号、右括号的字符。
20
字符串字面量是:
- 一个打开的单引号,后面跟着:
- 任意数量的双单引号和非单引号的字符,然后
- 一个关闭的单引号。
所以,我们的正则表达式是:
r"'(''|[^'])*'"