如何编写一个正则表达式来匹配一个字符串字面量,其中转义是引号字符的加倍?

8
我正在使用 ply 编写解析器,需要识别 FORTRAN 字符串字面量。这些字符串用单引号引起来,并且转义字符是双引号。例如: 'I don''t understand what you mean' 是一个有效的 FORTRAN 转义字符串。
Ply 使用正则表达式输入。到目前为止,我的尝试没有成功,我不明白为什么。 t_STRING_LITERAL = r"'[^('')]*'" 有什么想法吗?
4个回答

20

字符串字面量是:

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

因此,我们的正则表达式是:

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

2
这似乎无法处理转义序列。 - Cyoce

4
你想要这样的东西:
r"'([^']|'')*'"

这段话的意思是,在单引号内,你可以使用双引号或非引号字符。方括号定义了一个字符类,其中列出可能匹配或不匹配的字符。它不允许更复杂的内容,因此尝试使用括号并匹配多个字符序列('')是行不通的。相反,你的[^('')]字符类等同于[^'()],即它匹配任何不是单引号、左括号或右括号的字符。

1
通常来说,如果你遇到了问题字符串字面量的解析,想要快速且不太规范地解决它们很容易。但是,为了得到一个通用的解决方案,你可以使用pyparsing模块获取非常强大和完整的字符串字面量正则表达式。
>>> import pyparsing
>>> pyparsing.quotedString.reString
'(?:"(?:[^"\\n\\r\\\\]|(?:"")|(?:\\\\x[0-9a-fA-F]+)|(?:\\\\.))*")|(?:\'(?:[^\'\\n\\r\\\\]|(?:\'\')|(?:\\\\x[0-9a-fA-F]+)|(?:\\\\.))*\')'

我不确定FORTRAN的字符串字面量和Python之间是否存在重大差异,但如果没有其他参考资料,这是一个方便的参考。


这似乎无法处理f-strings。 - Dmitri Nesteruk

0
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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接