2012-07-06 51 views
2

我想在python中使用re模塊來匹配特定的模式。 我希望匹配一個完整的句子(更準確地說,我會說他們是由空格和/或標點分隔的字母數字字符串序列)在Python中的正則表達式的混淆行爲

例如。

  • 「這是一個普通的句子。」
  • 「這也是有效的」
  • 「等是這一」

我嘗試了正則表達式的各種組合,但我無法正確地掌握模式的工作,每個表達給我一個不同的但莫名其妙的結果(我承認我是初學者,但仍然)。


我嘗試:

  • 「((\ w +)(\ S)?)*」

    據我所知,這應該與一個或多個字母字母數字貪婪地跟着一個或沒有空白字符,然後它應該貪婪地匹配整個模式。這似乎並不是它所做的,很明顯我錯了,但我想知道爲什麼。 (我期望這會返回整個句子作爲結果) 我得到的第一個示例字符串的結果是[('句子','句子',''),('','','') ,('','',''),('','','')]。

  • 「(\ w +?)*」

    我什至不知道這應該如何工作。官方文檔(python幫助('re'))說,,+ ,?匹配前面RE的x或x(貪婪)重複。 在這種情況下,只是將前面的RE空間放在'?'或者是'\ w +'前面的RE?那麼''運營商的RE會是什麼?我得到的結果是['句子']。

  • 其他如「(\ w + \ s?)+)」; 「((\ w *)(\ s ??))等等,這些基本上是相同想法的變化,即句子是一組阿爾法數字,然後是單個/有限數量的空白,並且這種模式被重複並且結束了。

誰能告訴我我走到哪裏錯了,爲什麼,爲什麼上面的表達式不工作,我被他們期待?


PS我終於方式「[\ w] +「來爲我工作,但是通過這個我不能限制連續空白字符的數量。

+0

你使用're.findall()'? – 2012-07-06 23:35:13

+0

你如何檢索結果?我假設你正在使用捕獲組而不是整個匹配('.group(0)'或'.group()')? – oxc 2012-07-06 23:36:33

+0

@JoelCornett是的,我正在使用re.findall() – ffledgling 2012-07-06 23:52:04

回答

4

你對正則表達式的推理是正確的,你的問題是來自使用捕獲組的*。這裏有一個選擇:

>>> s="This is a regular sentence." 
>>> import re 
>>> re.findall(r'\w+\s?', s) 
['This ', 'is ', 'a ', 'regular ', 'sentence'] 

在這種情況下,它可能會更有意義,爲您以匹配字boundries使用\b

>>> re.findall(r'\w+\b', s) 
['This', 'is', 'a', 'regular', 'sentence'] 

另外,可以通過re.match匹配整個句子,並使用re.group(0)拿到了全場比賽:

>>> r = r"((\w+)(\s?))*" 
>>> s = "This is a regular sentence." 
>>> import re 
>>> m = re.match(r, s) 
>>> m.group(0) 
'This is a regular sentence' 
+0

我正在尋找匹配整個句子作爲一個正則表達式而不是單詞。所以正則表達式應該返回['這是一個正則句']。 – ffledgling 2012-07-06 23:46:50

+0

@Ayos我誤解了。我的編輯有幫助嗎? – 2012-07-06 23:57:48

+0

它的工作原理,如果有的話,我的推理似乎是正確的。 但爲什麼這不適用於findall?這使我更加困惑。如果我的推理是正確的,那麼爲什麼同樣的RE無法工作/ findall會給出非常不同的結果?沒有發現和匹配的基本差異嗎? – ffledgling 2012-07-07 00:18:22

3

這裏是一個真棒正則表達式教程網站:

http://regexone.com/

這裏有一個正則表達式匹配的例子給出:

([a-zA-Z0-9,\. ]+) 
0

你爲什麼要限制在連續空白字符的數量?由於一個句子可以有任意數量的單詞(字母數字字符序列)和一行中的空格,而是一個句子是以標點符號結束的文本區域,而不是上述序列中包含空格的文本區域。

([a-zA-Z0-9\s])* 

上面的正則表達式匹配一個句子,它是一系列或多個系列的空格。您可以將其細化爲以下內容:

([a-zA-Z0-9])([a-zA-Z0-9\s])* 

其中只簡單地聲明上述序列必須以字母數字字符開頭。

希望這是你正在尋找。

+0

我用術語Sentence來簡單介紹一下我正在處理的內容。我詳細說明了問題中一個句子的含義。另外,我使用它的應用程序要求我檢查兩者之間的空白數量,如果存在多個空白,則需要採取不同的操作。 這個答案似乎適合我目前的需求。但是,你能告訴我在我的正則表達式中邏輯的問題是什麼? – ffledgling 2012-07-06 23:51:23

0

也許這將幫助:

import re 

source = """ 
This is a regular sentence. 
this is also valid 
so is This ONE 
how about this one followed by this one 
""" 

re_sentence = re.compile(r'[^ \n.].*?(\.|\n| +)') 

def main(): 
    i = 0 
    for s in re_sentence.finditer(source): 
     print "%d:%s" % (i, s.group(0)) 
     i += 1 

if __name__ == '__main__': 
    main() 

我使用交替的表達(\.|\n| +)描述結束句子的條件。請注意在第三次交替中使用兩個空格。第二個空格具有'+'元字符,因此一行中的兩個或多個空格將成爲句尾。