2017-10-09 149 views
2

我需要以「number-number」格式查找數字範圍。該數字應該在0-3000範圍內。所以我想出了這個正則表達式python中的數值範圍的正則表達式

match = re.search(r'^[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]-[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]',sentence) 

當我跑了,我想只提取句子中的56-900的方案,但該方案提取其他數字也像2016年,CLP2012等。我想只提取在它們之間有「 - 」的數字。我的模式出了什麼問題。

+0

您應該使用'「[0-9] + - [0-9] +」'。 –

+0

「|」運算符的優先級最低,所以即使例如'[1-9] [0-9]'是一個可接受的模式:你應該在連字符之前和之後加上兩個部分的括號。另外,應該存在更緊湊的配方。 – rrobby86

+0

爲什麼不''[123] \ d {0,3}「'(或'」[0-3] \ d {0,3}「'包含0)? – user2314737

回答

0

此代碼提取物只是一個真正的範圍x-yx< y <= 3000

sentence = 'test 69 example 55-66 example 77-44 example 999-3001 example' 

for word in re.findall('\d+-\d+', sentence): 
    l = word.split('-') 
    if int(l[0])< int(l[1]) <= 3000: 
     word 

輸出這個例子:

'55-66' 
1

如果你想匹配的整數的範圍,你需要保護隨r比賽「\ b」(字符串的開頭/結尾):

>>> import re 

>>> text = "2016, CLP2012 56-900 3000-3000 4000-4000 123-123 0-0" 
>>> re.findall(r"\b\d+-\d+\b", text) 
['56-900', '3000-3000', '4000-4000', '123-123', '0-0'] 

如果你wa nt只能匹配從0到3000的整數,您需要更精確的RegEx,像這樣:

>>> r = r"(?:3000|[1-2]\d{3}|[1-9]\d{2}|[1-9]\d|\d)" 
>>> re.findall(r"\b" + r + "-" + r + r"\b", text) 
['56-900', '3000-3000', '123-123', '0-0'] 
+0

我認爲'^'開始,'$'結束更好。 – scriptboy

+0

@scriptboy:不,'^'(或'$')表示** string **的「begin」(或「end」)。不是「開始」(或「結束」)或**單詞**(它與'\ w +'匹配) –