2017-01-05 52 views
2

匹配的非空白表達我想使用re.search以提取所述第一組的非空白字符。我有以下pseudoscript,再現我的問題:經常用於在Python

#!/usr/bin/env python2.7 
import re 

line = "STARC-1.1.1.5    ConsCase WARNING Warning" 
m = re.search('^[^\S]*?',line) 
if m: 
    print m.group(0) 

這似乎是打印空白的,而不是STARC-1.1.1.5

到目前爲止,據我瞭解,這個正則表達式是說: 在生產線開始,找到了一組非空白字符,不要貪

我敢肯定這會工作,documentation說,我可以使用/ S,以匹配[]空白,所以我是不知道問題出在哪裏。

現在,我知道,我知道這可能看起來奇怪,你爲什麼不我使用一些其他的功能做到這一點?那麼,有不止一種方式來皮膚貓,我仍然得到了正則表達式在Python中的懸掛,所以我想知道如何使用re.search以這種方式提取這個領域。

+1

這裏是另一個 re.split( 「\ S *」,線)[0] – e4c5

+0

@melpomene re是貪婪。它不會分裂在這裏的空字符串 – e4c5

+0

@ e4c5我試過了,得到了'FutureWarning:split()需要一個非空模式match.'用​​'\ s +'我沒有得到警告。 – melpomene

回答

4

[^\S]negated character class,它等於\s(空白圖案)。 *?是一個懶惰的量詞,匹配零個或多個字符,但儘可能少的,並且在模式結尾使用時,實際上不會匹配任何字符。

更換你m = re.search('^[^\S]*?',line)符合

m = re.match(r'\S+',line) 

或 - 如果您還想允許空字符串匹配:

m = re.match(r'\S*',line) 

re.match方法錨定在字符串的開頭模式。隨着re.search,你需要保持^停泊在模式的開始:

m = re.search(r'^\S+',line) 

Python demo

import re 
line = "STARC-1.1.1.5    ConsCase WARNING Warning" 
m = re.search('^\S+',line) 
if m: 
    print m.group(0) 
# => STARC-1.1.1.5 

然而,在這裏,在這種情況下,你可能只用一個單純的split()

res = line.split() 
print(res[0]) 

another Python demo

2

\s匹配空白字符。

\S相匹配的非空白字符。

[...]在集合...一個字符匹配。

[^...]一個字符匹配不在集合...

[^\S]的字符不是一個非空白字符,即,其一個空白字符匹配相匹配。