2012-07-04 69 views
9

我有一个字符串像这样一个正则表达式的检测字符串不包括在双引号

"quick" "brown" fox jumps "over" "the" lazy dog

我需要一个正则表达式来检测不括在双引号的话。经过一些随机尝试后,我发现这个("([^"]+)")。这会检测用双引号括起来的字符串。但我想要的是相反的。即使尝试颠倒上面提到的正则表达式,我也无法想出它。正则表达式我很弱。请帮我

+1

你可以匹配所有字符串,一个引述'“'和'添加为NOT'此过滤器:) – gaussblurinc

+1

所以你要这抓住'狐狸跳跃懒狗'? – jared

+1

@jared:是一样的 – Shades88

回答

26

使用前瞻/向后断言:

(?<![\S"])([^"\s]+)(?![\S"]) 

例子:

>>> import re 
>>> a='"quick" "brown" fox jumps "over" "the" lazy dog' 
>>> print re.findall('(?<![\S"])([^"\s]+)(?![\S"])',a) 
['fox', 'jumps', 'lazy', 'dog'] 

这里最主要的是向前看/后向断言。你可以说:我在表达式之前需要这个符号,但我不希望它成为匹配本身的一部分。好。对于您使用断言

(?<![\S"])abc 

这是一个负回顾后。这意味着你想要abc但没有[\S"]之前它,这意味着在之前必须没有非空格字符(开头的字)或"

即相同的,但在其他方向:

abc(?![\S"]) 

这是一个负先行。这意味着你想要abc但是没有[\S"]之后吧。

有型四种differenet断言一般:

(?=pattern) 
    is a positive look-ahead assertion 
(?!pattern) 
    is a negative look-ahead assertion 
(?<=pattern) 
    is a positive look-behind assertion 
(?<!pattern) 
    is a negative look-behind assertion 
+1

非常感谢,这就像魔术:)像一个更多的青睐,你能解释一下吗?看起来有点复杂 – Shades88

+1

@ Shades88:没有所有:) –

+1

来吧......你知道他们的类型是“lookahead/lookbehind assertions”。你绝对可以解释我是如何工作的! – Shades88

0

从字符串

0

使用删除第一个引用这个表达式:

\s+(?<myword>([^\"\s]+)*)\s+ 

这应该是工作;并获得组名为myword。否则你需要修剪你的结果字符串。

+0

工作的话只有一个空格:'狐狸跳'例如 –

相关问题