2015-05-10 35 views
-1
import re 
caps = "bottle caps/ soda caps/ pop caps" 

regex = re.findall(r"\w[1-6]", caps) 

print(regex) 

輸出爲:在常規困惑表情的Python

[] 
然而

如果我這樣做

import re 
caps = "bottle caps/ soda caps/ pop caps" 

regex = re.findall(r"\w[1-6]*", caps) 

輸出繼電器是:

['b', 'o', 't', 't', 'l', 'e', 'c', 'a', 'p', 's', 's', 'o', 'd', 'a', 'c', 'a', 'p', 's', 'p', 'o', 'p', 'c', 'a', 'p', 's'] 

我怎麼使它輸出:

["bottle caps", "soda caps, "pop caps"] 

我知道你們會推薦使用.split,但我想了解的正則表達式更

我已經試過這還有:

import re 
caps = "bottle caps/ soda caps/ pop caps" 

regex = re.findall(r"\w[1-6]?\s*\w[1-3]*", caps) 

print(regex) 

輸出:

['bo', 'tt', 'le', 'ca', 'ps', 'so', 'da', 'ca', 'ps', 'po', 'p c', 'ap'] 

什麼發生了什麼?

+0

@ nu11p01n73R _I知道你們會建議使用.split,但我想了解正則表達式more_ – hjpotter92

+0

're.findall(R'\ w +帽','帽') - >'['瓶蓋','蘇打帽','流行帽']' – wim

回答

4

您似乎混淆{1,6},意思是「以前的模式重複1-6次」,用[1-6],意思是「範圍內的任意的字符16」。

所以,你有什麼:

\w[1-6] 

Regular expression visualization

Debuggex Demo

...將匹配一個字符,而隨後從1-6的數字。


把在端的*只是意味着0個或更多的是數字模式,這意味着任何字字符,接着是零個或多個數字1-6的。


但是如果你使用正確的語法,你得到你想要的東西:

\w{1,6} 

Regular expression visualization

Debuggex Demo

1

您可以使用r"(\w+[\s\b]+\w+)"這意味着:\w+ =一個字; [\s\b] =空間或單詞邊界:

import re 
caps = "bottle caps/ soda caps/ pop caps" 

output = re.findall(r"(\w+[\s\b]+\w+)", caps) 
print output # ['bottle caps', 'soda caps', 'pop caps'] 

(\w+[\s\b]+\w+) 

Regular expression visualization

Debuggex Demo

1

你混淆自己與究竟是怎樣定義的字符類,[1-6]將匹配單個字符範圍在16之間。你可能意思是{1,6},它會匹配16之間的前面的正則表達式標記,稱爲範圍運算符。

通過字符類[1-6]在第二次嘗試中*操作之前,你告訴正則表達式引擎,以匹配前面的標記「以上」時間,從而結束了每個單詞字符匹配單獨因爲你字符串中沒有數字字符。

相反,你可以簡單地寫正則表達式爲:

>>> re.findall(r"\w+ \w+", caps) 
['bottle caps', 'soda caps', 'pop caps']