将任意 Python 字符串与 Python 正则表达式匹配?

Posted

技术标签:

【中文标题】将任意 Python 字符串与 Python 正则表达式匹配?【英文标题】:Matching an arbitrary Python string with Python regex? 【发布时间】: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 字符串的例子吗? 【参考方案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

【讨论】:

以上是关于将任意 Python 字符串与 Python 正则表达式匹配?的主要内容,如果未能解决你的问题,请参考以下文章

python与正则表达式

常见的爬虫分析库-Python正则表达式与re模块

python与正则表达式

Python与正则表达式

python正则表达式

剑指Offer-正则表达式匹配(Python)