2012-12-04 68 views
1

我有這個正則表達式的大部分,但我有一個向前看的麻煩。我想將一個字符串分隔成一個郵編,然後是兩個字符串或兩個數字。這些數字可以是這樣的形式:蟒蛇正則表達式非ASCII字符

1 
1.5 
1.55 
11.55 

的中間位的文本可以是「沒有最低」和第三位只能是「免費」的文字。

E.g.

「YO1£10Free」==> YO1; 10;免

「yo1££8A 0.5」 ==> YO1; 8; 0.5

「yo1Nominimum£0.75」 ==> YO1;無最低限度; 0.75

我有這個第一位完成:

string = "YO1£ 10Free" 
patternPostCode = re.compile("[a-zA-Z]{1,2}[0-9][a-zA-Z0-9]?") 
postCode = re.findall(string,patternPostCode) 

字符串中的數字被發現:

patternCost = re.compile(r"(?<=\xa3)([0-9]| 
[0-9][0-9]| 
[0-9]?[0-9]?.[0-9]| 
[0-9]?[0-9]?.[0-9][0-9])") 

我很難加入「或文字等於「否最小「」到patternCost搜索。我也無法設法將預見包括在內。最後加上這個不起作用:

(?<=\xc2) 

任何幫助,將不勝感激。

回答

1

我想出了這個關於Python 2.7:

# -*- coding: utf-8 -*- 
import re 

raw_string = "YO1£ 10.01Free" 
string = raw_string.decode('utf-8') 
patternPostCode = re.compile(u"^(\w{3}.*)\s+(\d+\.?\d*)(\w+)$",flags=re.UNICODE) 
postCode = patternPostCode.findall(string) 

print postCode 
print u'; '.join(postCode[0]) 

這將返回:

[(u'YO1\xc2\xa3', u'10.01', u'Free')] 
YO1£; 10.01; Free 

首先,我從SO複製的原始字符串似乎是一個字節串,我不得不對它進行解碼到unicode(見byte string vs. unicode string. Python)。我想你可能一般都會有unicode編碼錯誤 - Â符號是一個典型的例子。

然後,我用re.UNICODE標誌使你的正則表達式對unicode友好。這意味着您可以使用\ w來表示「字母數字」,\ d表示「數字」以unicode友好的方式。

http://docs.python.org/2/library/re.html#module-re

由於正則表達式是經常被誤認爲線路噪聲,還是讓我解壓爲您:

u"^(\w{3}.*)\s+(\d+\.?\d*)(\w+)$" 
  • ^=行開始
  • (\ W {3} *)=完全匹配三個字母數字字符(\ w {3}),隨後是任何事物(。*)和分組(這是整個事物的括號)。我一般不喜歡。*,但有必要抓住垃圾。如果你不需要它,將它移到括號外。
  • \ s + - 至少有一個空格。我們會把它扔掉
  • (\ d +。?\ d *) - 匹配一個或多個數字,後跟一個可選的句點,後跟可選的一個或多個數字。這將匹配10,10,10,10,10.0000等等。
  • (\ w +) - 一個或多個字母數字字符
  • $ - 線

的比賽結束這當然不是我曾經寫過的最漂亮的正則表達式,但我希望它足以讓你開始。

+0

謝謝雷切爾,這確實有很大的幫助。正則表達式非常恐怖,所以感謝解釋它!歡呼unicode技巧,這已經破壞了我的頭! – user578582

+0

嗚!我很高興它幫助你。 Unicode是Python 2中屁股的痛點,這個Pycon視頻幫助我開始了它:http://www.youtube.com/watch?v=sgHbC6udIqc –