如何编写正则表达式匹配转义字符为引号重复的字符串文字?

8 投票
4 回答
8916 浏览
提问于 2025-04-15 18:30

我正在用 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

字符串字面量是:

  1. 一个打开的单引号,后面跟着:
  2. 任意数量的双单引号和非单引号的字符,然后
  3. 一个关闭的单引号。

所以,我们的正则表达式是:

r"'(''|[^'])*'"

撰写回答