2014-02-11 19 views
0

我們剛剛開始學習正則表達式,但是當我嘗試使用正則表達式進行搜索時,我無法在字符串中找到任何匹配項。我究竟做錯了什麼?爲什麼我的for-loop不能匹配我定義的任何正則表達式?

我創造了六個獨立的字符串(只是它的樣子),然後連接起來他們爲一個,然後我通過分割字符串的話儘量環和搜索正則表達式的一個,我宣佈

以下,我翻譯了右邊的字符串,只是讓你知道它說了什麼。

myString1 = "Skal vi moetes neste torsdag?" # - Shall we meet next Thursday 
myString2 = "Hva med aa heller moetes mandag?" # - How about Monday 
myString3 = "Hvordan gikk moetet forrige mandag?" # - How did the meeting on monday go? 
myString4 = "Det gikk bra, vi skal moetes igjen tirsdag onsdag fredag lørdag søndag 13. september." # - It went well, we are meeting again on Sunday September 13th. 
myString5 = "Altsaa, 13/09/2014?" 
myString6 = "Ja, Sunday 13. september 2014." # - Yes, Sunday, September 13th 2014 

myStringAll = (myString1 + myString2 + myString3 + myString4 + myString5 + myString6) 
myWords = myStringAll.split() 

regWeekDays = re.compile(r'^(man|tirs|ons|tors|fre|lør|søn)dag$', re.IGNORECASE) 
regNextLast = re.compile(r'^[neste].$', re.IGNORECASE) 
regDay = re.compile(r'^([0-2][0-9]|3[0-1])$') 
regYear = re.compile(r'^([1-2][0-9][0-9][0-9])$') 

for words in myWords: 
    matches = re.findall(regNextLast, words) 
    if matches: 
     print words 
+1

'r'^ [neste]。$''的意思是匹配任何字符'n','e','s','t'後跟另一個字符。我認爲你還沒有真正理解正則表達式。 – arocks

+1

小心:您正在定義源中的字節字符串,並未指定編碼。如果您從文件加載字符串,您還將加載編碼的字節字符串,並且不能保證正則表達式將在同一編解碼器中包含字節。改用Unicode值;請參閱http://docs.python.org/2/howto/unicode.html。聲明您的源代碼編解碼器,使用unicode值並解碼文件內容。 –

回答

1

有幾個問題,你的正則表達式,但最主要的是,你使用^$在每個表達式的開頭和結尾。 ^表示匹配字符串的開頭,並且$匹配字符串的結尾。除非你的字符串是嚴格的表達式的長度,findall不會匹配任何東西。

爲例

In [55]: re.findall(r'^a$', 'abcdefghijkl') 
Out[55]: [] # "a" is not matched! 

^$應僅用於顯式匹配的字符串,分別的開頭和結尾(或在某些情況下,行的末尾,見documentation) 。去掉這些,你的表情應該開始匹配。

下面是一些具體的問題:

  • ^(man|tirs|ons|tors|fre|lør|søn)dag$僅所述第一部分(man|tirs|ons|tors|fre|lør|søn)將被捕獲並findAll返回。更改爲一個non capturing group,使返回整個表達式:

    (?:man|tirs|ons|tors|fre|lør|søn)dag

  • ^[neste].$,我想你想捕捉的字符串"neste"。目前您有一套[neste],它將匹配一個以下字符:n,e,st。將其更改爲neste
    關於集合的文檔可以在here找到。
  • ^([0-2][0-9]|3[0-1])$主要是罰款,一邊從^$,你可以省略01之間的連字符,排除括號,並使用數字符號\d(相當於[0-9],但是:

    [0-2]\d|3[01]

  • 最後在'^([1-2][0-9][0-9][0-9])$'(再次,除了^$)表達式應該按預期工作,但您可以使它更簡潔。您可以使用curly bracket syntax指定代表吃。因此,任何一年1000-2999匹配字符串變成:

    [12]\d{3}

我建議你仔細閱讀HOWTO on Regular Expressions

+0

謝謝!這一點不是什麼問題,但你幫我找到了錯誤。 – Ingrid

+0

@Ingrid:沒問題:)看我的編輯。 –

+0

非常感謝!非常非常有幫助! – Ingrid

1

r'^[neste].$'可能不是你的意思。此正則表達式查找長度爲兩個字符的字符串,其中第一個字符爲in ('e', 'n', 's', 't'),後跟任何其他單個字符。您從大字符串中分離出來的兩個字符的子字符串都不符合此模式。

也許你可以受益於一個教程:http://www.regular-expressions.info/tutorial.html

相關問題