Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式匹配打开或关闭的Python字符串_Python_Regex - Fatal编程技术网

正则表达式匹配打开或关闭的Python字符串

正则表达式匹配打开或关闭的Python字符串,python,regex,Python,Regex,我希望在输入源代码时找到源代码中所有Python字符串的内容。我假设字符串包含在一行中,但它可能尚未关闭 现在我有 for m in re.finditer('''(?P<open>(?:""")|"|(?:''\')|')(?:((?P<closed>.*?)(?P=open))|(?P<unclosed>.*))''', 'as"df'): i = 3 if m.group(3) else 4 print m.group(i) 对于re.

我希望在输入源代码时找到源代码中所有Python字符串的内容。我假设字符串包含在一行中,但它可能尚未关闭

现在我有

for m in re.finditer('''(?P<open>(?:""")|"|(?:''\')|')(?:((?P<closed>.*?)(?P=open))|(?P<unclosed>.*))''', 'as"df'):
    i = 3 if m.group(3) else 4
    print m.group(i)
对于re.FindItemer中的m(“”’(?P(?:“”“”)(?:“”“”)(?:“”“”)(?:(?P.?(?P=open))|(?P.*))“”,“,”作为“df”):
如果m组(3)其他4,则i=3
打印m.group(i)
但我希望有一个可预测的匹配组来搜索

re.finditer('''(?P<open>(?:""")|"|(?:''\')|')(.*?)(?P=open)''', line)
re.finditer('''(?P(?:'')|“(?:''\)|')(*?(?P=open'),第行)
更好,因为字符串文本的内容将始终位于匹配组中(但此字符串与尚未关闭的字符串不匹配)

编辑:我对多行匹配没有意见,我只是想通过将它们排除在输入中来简化问题。

这样如何:

^("""|'''|"|')((?!\\").*?)(?:(?<!\\)\1$|$)
^(“|”“|”|“|”)((?!\\”.*?(?)?
我不确定当字符串出现语法错误时,当你在三个引号之前(在开始和结束)有两个双引号时,你会喜欢什么样的行为。但据我所知,这应该可以完成这项工作

使用代码中的第二个匹配组。

这样如何:

^("""|'''|"|')((?!\\").*?)(?:(?<!\\)\1$|$)
^(“|”“|”|“|”)((?!\\”.*?(?)?
我不确定当字符串出现语法错误时,当你在三个引号之前(在开始和结束)有两个双引号时,你会喜欢什么样的行为。但据我所知,这应该可以完成这项工作

使用代码中的第二个匹配组。

您可以尝试以下方法:

(?s)('''|"""|'|")((?:(?=([^"'\\]+|\\.|(?!\1)["']))\3)*)\1?
引号在组1中捕获,末尾使用反向引用关闭字符串
\1

[^“\\]+\\.\(?!\1)[”]
描述了允许的内容:

[^"'\\]+   # all that is not a quote or a backslash
\\.        # an escaped character
(?!\1)["'] # a quote that is not the captured quote
然后,为了重复这些元素而不冒a的风险,我使用以下技巧模拟a:
(?>子模式)*
=>
(?:(?=(子模式))\1)*

注意:如果要禁止多行匹配,只需将允许的内容更改为
[^”'\r\n\\]+\\\.|(?!\1)[“]
并删除
(?s)
修饰符

[编辑]

如果要匹配字符串末尾的反斜杠(例如:
text=r''abc def ghi\
),则需要将模式更改为:

多行模式:

(?m)('''|"""|'|")((?:(?=([^"'\r\n\\]+|\\(?:.|$)|(?!\1)["']))\3)*)\1?
(?s)('''|"""|'|")((?:(?=([^"'\\]+|\\(?:.|$)|(?!\1)["']))\3)*)\1?
单线模式:

(?m)('''|"""|'|")((?:(?=([^"'\r\n\\]+|\\(?:.|$)|(?!\1)["']))\3)*)\1?
(?s)('''|"""|'|")((?:(?=([^"'\\]+|\\(?:.|$)|(?!\1)["']))\3)*)\1?
您可以尝试以下方法:

(?s)('''|"""|'|")((?:(?=([^"'\\]+|\\.|(?!\1)["']))\3)*)\1?
引号在组1中捕获,末尾使用反向引用关闭字符串
\1

[^“\\]+\\.\(?!\1)[”]
描述了允许的内容:

[^"'\\]+   # all that is not a quote or a backslash
\\.        # an escaped character
(?!\1)["'] # a quote that is not the captured quote
然后,为了重复这些元素而不冒a的风险,我使用以下技巧模拟a:
(?>子模式)*
=>
(?:(?=(子模式))\1)*

注意:如果要禁止多行匹配,只需将允许的内容更改为
[^”'\r\n\\]+\\\.|(?!\1)[“]
并删除
(?s)
修饰符

[编辑]

如果要匹配字符串末尾的反斜杠(例如:
text=r''abc def ghi\
),则需要将模式更改为:

多行模式:

(?m)('''|"""|'|")((?:(?=([^"'\r\n\\]+|\\(?:.|$)|(?!\1)["']))\3)*)\1?
(?s)('''|"""|'|")((?:(?=([^"'\\]+|\\(?:.|$)|(?!\1)["']))\3)*)\1?
单线模式:

(?m)('''|"""|'|")((?:(?=([^"'\r\n\\]+|\\(?:.|$)|(?!\1)["']))\3)*)\1?
(?s)('''|"""|'|")((?:(?=([^"'\\]+|\\(?:.|$)|(?!\1)["']))\3)*)\1?

这与一个尚未关闭的字符串不匹配。问题明确地说,
,但它可能尚未关闭。
@Kassymorsel:没错,现在它已经关闭了。感谢这里的精彩解释,我很难理解这一点。帮了我一把。@Thomas:这不是一个简单的模式,特别是使用以下事实的技巧:一个外观的内容前面是自然原子的。@Thomas:如果您想匹配字符串或行末尾的反斜杠,请进行一点编辑。这与尚未关闭的字符串不匹配。问题明确地说,
,但它可能尚未关闭。
@kassymorsel:是的,现在可以了。感谢这里的精彩解释,我很难理解这一点。帮了我。@Thomas:这不是一个简单的模式,特别是使用了前瞻内容自然是原子的这一事实的技巧。@Thomas:如果你想匹配字符串或行末尾的反斜杠,可以进行一点编辑。这有多个匹配组,我必须检查,就像我的顶部示例。哦,忽略了这一部分。更新的答案。这是m我必须检查多个匹配组,比如我的第一个示例。哦,忽略了这一部分。更新了答案。