我的值是这样的:
"Foo Bar" "Another Value" something else
什么正则表达式将返回括在引号中的值(例如Foo Bar和Another Value)?
我的值是这样的:
"Foo Bar" "Another Value" something else
什么正则表达式将返回括在引号中的值(例如Foo Bar和Another Value)?
当前回答
string = "\" foo bar\" \"loloo\""
print re.findall(r'"(.*?)"',string)
试试这个,就像一个魅力!!
\表示跳过字符
其他回答
我能够创建这个正则表达式来满足我的需求。
我需要匹配一个包含引号的特定值。它必须是完全匹配的,没有部分匹配可以触发命中
如。“test”不能与“test2”匹配。
reg = r"""(['"])(%s)\1"""
if re.search(reg%(needle), haystack, re.IGNORECASE):
print "winning..."
猎人
模式(["'])(?:(?=(\\?))\2.)*?上面的\1完成了这项工作,但我担心它的性能(它不差,但可以更好)。我的比它快20%。
模式“(.*?)”是不完整的。我对阅读这篇文章的人的建议是不要使用它!!
例如,它不能捕获很多字符串(如果需要,我可以提供一个详尽的测试用例),如下所示:
$string = '你好吗?我很好,谢谢你;
其余的都和上面那个一样“好”。
如果你真的关心性能和精度,那么就从下面的开始:
/(['"])((\\\ 1 |。)* ?)\ 1 /通用
在我的测试中,它涵盖了我遇到的每一个字符串,但如果你发现一些不工作的东西,我很乐意为你更新它。
在在线正则表达式测试器中检查我的模式。
特别的是,这些答案都不会产生一个正则表达式,其中返回的匹配是所要求的引号内的文本。MA-Madden尝试了,但只获得了内部匹配,而不是整个匹配。一种实际的方法是:
(?<=(["']\b))(?:(?=(\\?))\2.)*?(?=\1)
这方面的例子可以在这个演示https://regex101.com/r/Hbj8aP/1中看到
The key here is the the positive lookbehind at the start (the ?<= ) and the positive lookahead at the end (the ?=). The lookbehind is looking behind the current character to check for a quote, if found then start from there and then the lookahead is checking the character ahead for a quote and if found stop on that character. The lookbehind group (the ["']) is wrapped in brackets to create a group for whichever quote was found at the start, this is then used at the end lookahead (?=\1) to make sure it only stops when it finds the corresponding quote.
唯一的另一个复杂之处在于,由于前向查询实际上并不使用结束引号,它将被开始后向查询再次找到,这将导致匹配同一行上结束引号和开始引号之间的文本。在开头引用(["']\b)上加上一个单词边界有助于解决这个问题,尽管理想情况下我想跳过前瞻,但我认为这是不可能的。中间允许转义字符的部分直接取自亚当的回答。
string = "\" foo bar\" \"loloo\""
print re.findall(r'"(.*?)"',string)
试试这个,就像一个魅力!!
\表示跳过字符
一般来说,下面的正则表达式片段就是你要找的:
"(.*?)"
这使用了非贪婪的*?运算符来捕获下一个双引号之前的所有内容。然后,使用特定于语言的机制提取匹配的文本。
在Python中,你可以这样做:
>>> import re
>>> string = '"Foo Bar" "Another Value"'
>>> print re.findall(r'"(.*?)"', string)
['Foo Bar', 'Another Value']