2012-10-17 17 views
0

假設我有一個詞AB1234XZY甚至1AB1234XYZ正則表達式代碼不起作用(Python)

我想提取只有'AB1234'或1AB1234(即一切,直到最後的字母)。

我用下面的代碼來提取,但它不工作:

base= re.match(r"^(\D+)(\d+)", word).group(0) 

當我print base,它不工作的第二種情況。任何想法爲什麼?

+0

你想在兩種情況下都匹配到「123」嗎?如果您有不同的號碼: - AB123452A? –

+0

你想匹配文本之間的數字嗎? – pogo

+0

我想提取AB1234,所以基本上所有的東西都在最後的字母之前。我很確定我之前在那裏工作的代碼... – user1328021

回答

1

,因爲它有一個開始你的正則表達式不第二種情況工作數;模式開始處的\D與不是數字的任何內容匹配。

對於這個 --simpler,你應該可以使用一些相當簡單的事情,事實上,比我在這裏看到的任何東西都要簡單。

'.*\d' 

就是這樣!這應該匹配包括字符串中最後一個數字在內的所有內容,然後忽略所有內容。

Here's the pattern working online,所以你可以看看自己。

+1

謝謝!!!!我知道必須有一個更簡單的方法。並感謝您向我介紹RegexPlanet。那個網站很棒。 – user1328021

1

(.+?\d+)\w+會給你你想要的。

甚至像這樣

^(.+?)[a-zA-Z]+$ 
+0

如果我是你,我會做出最初的'。+'貪婪,因爲這對'12AB1234XYZ'(開始時有兩個或更多數字)不起作用。但是,它應該適用於他的樣本。 –

0

re.match開始在字符串的開頭,並re.search簡單尋找它的字符串中。都返回第一場比賽。 .group(0)是包含在比賽中的所有東西,如果你有捕獲組,那麼.group(1)是第一個組......等等等等......與常規約定相反,其中0是第一個索引,在這種情況下,0是一個特殊用例意味着一切。

在你的情況下,取決於你真正需要捕獲什麼,也許使用re.search更好。而不是使用2組,您可以使用(\D+\d+)記住,它將捕獲第一個(非數字,數字)組。對你來說可能就足夠了,但你可能想要更具體。

「結尾的字母前的一切」讀您的評論後

這正則表達式是你所需要的:

regex = re.compile(r'(.+)[A-Za-z]') 
+0

're.match'和're.search'應該沒什麼關係,因爲他使用'^'錨。這迫使匹配從字符串的開始處開始。 –