【问题标题】:Matching an arbitrary Python string with Python regex?将任意 Python 字符串与 Python 正则表达式匹配?
【发布时间】:2020-06-12 23:33:43
【问题描述】:

我正在使用 Python 源代码语料库。我希望将字符串替换为STRING。 Python 字符串很烦人,因为它们允许使用很多分隔符。这是我尝试过的方法以及遇到的问题。

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

    这不起作用,因为如果字符串包含相反的分隔符。

  • r'(\'|"|\'\'\'|""")(?:\\\1|(?!\1))*\1'

    这是我的全部尝试,但前瞻不起作用。如果可能的话,我基本上想要r'(\'|"|\'\'\'|""")(?:\\\1|[^\1])*\1'

  • 多行字符串搞砸了。您不能使用[^"""],因为""" 不是一个字符。

  • 包含其他分隔符的字符串,例如"'"
  • '\'' 这样的分隔符转义的字符串。

这些是需要匹配的字符串类型。整个块是一个包含分隔符的字符串。

  • '/$\'"`'
  • '\\'
  • '^__[\'\\"]([^\'\\"]*)[\'\\"]'
  • "Couldn't do that"

这些都是有效的字符串,但您可能会看到很难匹配它们的地方。本质上,我想要这个:

def hello_world():
    print("'blah' \"blah\"")

变成:

def hello_world():
    print( STRING )

为简单起见,假设整个 Python 文件都在一个字符串中。现在我正在逐行读取文件,但如有必要,我可以将其视为一个字符串。 如何读取文件并不重要。如果您的解决方案需要特定方法,我将使用该方法。 我不确定这个问题可以用正则表达式完全解决。如果您有涉及其他代码的解决方案,我们也将不胜感激。

【问题讨论】:

  • 为什么不在 AST 级别处理这个,而不是尝试正则表达式源?
  • 我也在考虑这种方法,但我也想测试这种方法。
  • 为什么不将"""'''"' 的四个正则表达式与| 连接起来?
  • 我已经尝试过了,但我在使用前瞻时遇到了问题。
  • @Mike 你能举一个有问题的 f 字符串的例子吗?

标签: python regex string regexp-replace


【解决方案1】:

您可以尝试匹配带引号的字符串但允许转义的正则表达式:

[rR]?(?:'([^\\']*(?:\\.[^\\']*)*)'|"([^\\"]*(?:\\.[^\\"]*)*)")

Demo

虽然这可能会捕获大部分字符串,但我很确定仍有一些例外。

这是基于 J. Friedl 的 unrolling the loop 技术:

展开循环(使用双引号)

"                              # the start delimiter
 ([^\\"]*                      # anything but the end of the string or the escape char
         (?:\\.                #     the escape char preceding an escaped char (any char)
               [^\\"]*         #     anything but the end of the string or the escape char
                      )*)      #     repeat
                             " # the end delimiter

【讨论】:

    猜你喜欢
    • 2013-10-18
    • 2020-12-01
    • 2020-11-29
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    • 2019-05-01
    相关资源
    最近更新 更多