如何编写正则表达式来匹配转义是引号字符的两倍的字符串文字?

2024-09-29 05:30:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用ply编写一个解析器,它需要标识FORTRAN字符串文本。它们用单引号引起来,转义字符是双引号。i、 e

'I don''t understand what you mean'

是有效的转义FORTRAN字符串。

Ply接受正则表达式中的输入。到目前为止,我的尝试没有成功,我不明白为什么。

t_STRING_LITERAL = r"'[^('')]*'"

有什么想法吗?


Tags: 字符串文本you解析器meanwhat标识ply
3条回答

对于解析给您带来问题的特定字符串文本,通常很容易获得快速而脏的内容,但是对于一般解决方案,您可以从pyparsing module中获得一个非常强大且完整的字符串文本正则表达式:

>>> import pyparsing
>>> pyparsing.quotedString.reString
'(?:"(?:[^"\\n\\r\\\\]|(?:"")|(?:\\\\x[0-9a-fA-F]+)|(?:\\\\.))*")|(?:\'(?:[^\'\\n\\r\\\\]|(?:\'\')|(?:\\\\x[0-9a-fA-F]+)|(?:\\\\.))*\')'

我不确定FORTRAN的字符串文本和Python的字符串文本之间是否有显著的区别,但是如果没有其他东西的话,它是一个方便的引用。

你想要这样的东西:

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

这表示在单引号内可以有双引号或非引号字符。

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

字符串文字是:

  1. 一个开放的单引号,后跟:
  2. 任何数量的双引号和非单引号,然后
  3. 最后一句话。

因此,我们的regex是:

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

相关问题 更多 >