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

时间:2010-01-26 22:40:45

标签: python regex fortran ply

我正在编写一个使用ply的解析器,需要识别FORTRAN字符串文字。这些引号用单引号引用,转义字符加倍单引号。即。

'I don''t understand what you mean'

是有效的转义FORTRAN字符串。

Ply以正则表达式输入。到目前为止我的尝试不起作用,我不明白为什么。

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

有什么想法吗?

4 个答案:

答案 0 :(得分:20)

字符串文字是:

  1. 一个开放的单引号,然后是:
  2. 任意数量的双引号和非单引号,然后
  3. 一个单引号。
  4. 因此,我们的正则表达式是:

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

答案 1 :(得分:4)

你想要这样的东西:

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

这表示在单引号内部,您可以使用双引号或非引号字符。

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

答案 2 :(得分:0)

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

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

我不确定FORTRAN的字符串文字与Python之间存在显着差异,但如果没有别的话,这是一个方便的参考。

答案 3 :(得分: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'