Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.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
解析出一个由引号包围的字符串,该字符串包含单词“quot&引用;并打印字符串Python Regex_Python_Regex - Fatal编程技术网

解析出一个由引号包围的字符串,该字符串包含单词“quot&引用;并打印字符串Python Regex

解析出一个由引号包围的字符串,该字符串包含单词“quot&引用;并打印字符串Python Regex,python,regex,Python,Regex,我试图用正则表达式解析出一个字符串,第一个文本用引号括起来,里面有单词“quoted” . 最后我打印出字符串。 输出应为“这是一条带引号的消息” 首先,让我说,像这样的在线编辑在这里真的很有用 其次,这里是一个有效的正则表达式字符串: “[^”]*引用[^”]*” 让我解释一下发生了什么: 当您使用“*?quoted.*”并在其中获得“带引号的消息”时。“这是一条带引号的消息。”,发生的事情是*也匹配了引号”。即使量词设置为lazy,regex也从左到右读取,这意味着它将开始从左到右扩展。现

我试图用正则表达式解析出一个字符串,第一个文本用引号括起来,里面有单词“quoted” . 最后我打印出字符串。 输出应为“这是一条带引号的消息”


首先,让我说,像这样的在线编辑在这里真的很有用

其次,这里是一个有效的正则表达式字符串:

“[^”]*引用[^”]*”
让我解释一下发生了什么:


当您使用
“*?quoted.*”
并在其中获得
“带引号的消息”时。“这是一条带引号的消息。”
,发生的事情是
*
也匹配了引号
。即使量词设置为lazy,regex也从左到右读取,这意味着它将开始从左到右扩展。现在,我将
替换为
[^]
,这意味着所有引号都将被避免,因此现在,
[^”]*
无法与
匹配,并且生成了预期的字符串。

您的regexp几乎是正确的。您需要两件事:

  • 使用括号捕获您感兴趣保留的位-然后可与
    方法一起使用。
    字符不包括在捕获组中。(我在这里假设,在问题中使用它们的地方,只是引用字符串,而不是暗示您希望它们作为输出的一部分。)

  • 您的第一个
    *?
    将匹配任意数量的任何(非换行)字符,即使它是“懒惰”而不是贪婪的,它仍然会找到与第一个可用起始位置的匹配,这可能会导致它包含
    字符本身。应将其替换为
    [^”]*?
    ,以确保它们不匹配。(第二个
    *?
    可以类似地更改或保持不变;这不重要,因为在这种情况下,惰性量词足以确保它不匹配任何
    字符。)

这使得:

This is a quoted message.

你必须考虑整个模式是否匹配。关键是,如果它在第一个
”尝试一个起始位置,那么它会发现它无法使它匹配,因为
[^”]
位不允许与第二个
位匹配,第二个
位位于第二个
位和引用的
字之间,因此整个事情不匹配。因此它继续尝试后面的起始位置(这就是
搜索
所做的)直到它到达一个更晚的
作为起始位置,这一次它确实匹配。恐怕不是特别的,只是练习一下。@keepitrealman希望你也注意到,在这里我仍然使用了一个懒惰的量词
[^”]*?
,而MZ将它改为贪婪的量词
[^]*
,它们都可以工作。如果字符串多次包含单词“quoted”,则这两个regexp的工作方式略有不同(如果您尝试其他捕获组,您会发现这一点),但总体效果仍然是一样的。这个问题的编辑历史非常奇怪-似乎,在你得到答案后,你决定用胡言乱语替换这个问题,你做了好几次-结果它被版主删除了一段时间。这对MZ和M是相当不敬的e、 他们不厌其烦地为你回答了你的问题。请不要再这样做了。只是想提醒你注意这样一个事实,即该问题在被删除一段时间后现在已经恢复——另请参见我现在在该问题下发布的评论。
import re
text = 'I have "message with quotes" in it. "This is a quoted message."'
r = re.search('"([^"]*?quoted.*?)"', text)
if r == None:
    print("not found")
else:
    print(r.group(1))
This is a quoted message.