将任意 Python 字符串与 Python 正则表达式匹配?
Matching an arbitrary Python string with Python regex?
我正在使用 Python 源代码语料库。我希望将字符串替换为 STRING
。 Python 字符串很烦人,因为它们允许使用如此多的分隔符。这是我尝试过的方法以及我 运行 遇到的问题。
r'"(\"|[^"])*"'
和 r"'(\'|[^'])*'"
这不起作用,因为如果字符串包含相反的定界符。
r'(\'|"|\'\'\'|""")(?:\|(?!))*'
这是我的一个包罗万象的尝试,但前瞻不起作用。如果可能的话,我基本上想要 r'(\'|"|\'\'\'|""")(?:\|[^])*'
。
多行字符串乱七八糟。您不能使用 [^"""]
因为 """
不是一个字符。
- 包含其他分隔符的字符串,例如
"'"
.
- 转义分隔符的字符串,如
'\''
.
这些是需要匹配的字符串种类。整个块是一个包含分隔符的字符串。
'/$\'"`'
'\'
'^__[\'\"]([^\'\"]*)[\'\"]'
"Couldn't do that"
这些都是有效的字符串,但您可能会发现很难匹配它们的地方。本质上,我想要这个:
def hello_world():
print("'blah' \"blah\"")
成为:
def hello_world():
print( STRING )
为简单起见,假设整个 Python 文件都在一个字符串中。现在我正在逐行读取文件,但如果需要,我可以将其视为一个字符串。 文件的读取方式真的无关紧要。如果您的解决方案需要特定的方法,我会使用它。
我不确定这个问题可以用正则表达式完全解决。如果您有涉及其他代码的解决方案,我们也将不胜感激。
您可以尝试匹配带引号的字符串但允许转义的正则表达式:
[rR]?(?:'([^\']*(?:\.[^\']*)*)'|"([^\"]*(?:\.[^\"]*)*)")
虽然这可能会捕获大部分字符串,但我很确定仍有一些例外。
这是基于 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 源代码语料库。我希望将字符串替换为 STRING
。 Python 字符串很烦人,因为它们允许使用如此多的分隔符。这是我尝试过的方法以及我 运行 遇到的问题。
r'"(\"|[^"])*"'
和r"'(\'|[^'])*'"
这不起作用,因为如果字符串包含相反的定界符。
r'(\'|"|\'\'\'|""")(?:\|(?!))*'
这是我的一个包罗万象的尝试,但前瞻不起作用。如果可能的话,我基本上想要
r'(\'|"|\'\'\'|""")(?:\|[^])*'
。多行字符串乱七八糟。您不能使用
[^"""]
因为"""
不是一个字符。- 包含其他分隔符的字符串,例如
"'"
. - 转义分隔符的字符串,如
'\''
.
这些是需要匹配的字符串种类。整个块是一个包含分隔符的字符串。
'/$\'"`'
'\'
'^__[\'\"]([^\'\"]*)[\'\"]'
"Couldn't do that"
这些都是有效的字符串,但您可能会发现很难匹配它们的地方。本质上,我想要这个:
def hello_world():
print("'blah' \"blah\"")
成为:
def hello_world():
print( STRING )
为简单起见,假设整个 Python 文件都在一个字符串中。现在我正在逐行读取文件,但如果需要,我可以将其视为一个字符串。 文件的读取方式真的无关紧要。如果您的解决方案需要特定的方法,我会使用它。 我不确定这个问题可以用正则表达式完全解决。如果您有涉及其他代码的解决方案,我们也将不胜感激。
您可以尝试匹配带引号的字符串但允许转义的正则表达式:
[rR]?(?:'([^\']*(?:\.[^\']*)*)'|"([^\"]*(?:\.[^\"]*)*)")
虽然这可能会捕获大部分字符串,但我很确定仍有一些例外。
这是基于 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