将任意 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 正则表达式匹配?的主要内容,如果未能解决你的问题,请参考以下文章