2009-09-27 68 views
2

我想檢查一個包含句點「。」的字符串,最多一次在python中。正則表達式最多出現一次

+0

你能給什麼將是有效的字符串一些例子,這將是無效的字符串?這個問題有點含糊。例如,期間可以有字符嗎?你只是在談論連續的字符,或字符串中的所有字符? – 2009-09-27 08:41:48

+0

我想檢查整數和小數。所以在這種情況下有效的字符串將是2.34或2.無效的字符串將是2.2.3。其實,我現在所擁有的是:[如果不是re.search(「[0-9 \。] + $」,item)或不re.search(「^ * \。?* $」,item) :返回「無效值」]。如果你知道更好的方法,請讓我知道。謝謝! – teggy 2009-09-27 08:54:09

回答

7
[^.]*\.?[^.]*$ 

而且一定要match,不search

>>> dot = re.compile("[^.]*\.[^.]*$") 
>>> dot.match("fooooooooooooo.bar") 
<_sre.SRE_Match object at 0xb7651838> 
>>> dot.match("fooooooooooooo.bar.sad") is None 
True 
>>> 

編輯

如果你只考慮整數和小數,那就更簡單了:

def valid(s): 
    return re.match('[0-9]+(\.[0-9]*)?$', s) is not None 

assert valid("42") 
assert valid("13.37") 
assert valid("1.") 
assert not valid("1.2.3.4") 
assert not valid("abcd") 
+1

如果你在表達式的開頭有一個'^',或者是因爲你匹配而暗示的? – 2009-09-27 09:05:12

+0

暗示,正確;) – NicDumZ 2009-09-27 09:07:49

+0

[顯式比隱含更好](http://www.python.org/dev/peps/pep-0020/),所以在表達式的開頭應該有一個「^」 。 – Bengt 2013-04-01 18:00:59

0

雖然期間是特殊的字符,它必須逃脫。所以「\。+」應該可以工作。

編輯:

使用'?'而不是「+」來匹配一個或零個重複。 看一看:re — Regular expression operations

+1

這將匹配1次或更多次。我認爲這個問題需要0或1次。 – 2009-09-27 08:40:32

+0

你說得對。在正則表達式加上意味着一個或多個。我應該使用問號而不是加號。 – 2009-09-27 08:45:53

2

您可以使用:

re.search('^[^.]*\.?[^.]*$', 'this.is') != None 

>>> re.search('^[^.]*\.?[^.]*$', 'thisis') != None 
True 
>>> re.search('^[^.]*\.?[^.]*$', 'this.is') != None 
True 
>>> re.search('^[^.]*\.?[^.]*$', 'this..is') != None 
False 

(匹配週期0或者1次)

0

如果期間應當將整個字符串中只有一次的存在,然後使用?操作:

^[^.]*\.?[^.]*$ 

打破此:

  1. ^相匹配的字符串的開頭
  2. [^.]匹配零個或多個字符不屬於週期
  3. \.?期間字符匹配(必須與\轉義,因爲它是一個保留的字符)恰好爲0或1次
  4. [^.]*是在2中使用上述
  5. $相同的圖案串

作爲的端部相匹配之外,個人我不會使用正則表達式此(除非我CHEC國王的其他方面的有效性字符串也)。我只會使用計數功能。

+0

除非確保匹配*整個*字符串,否則它將匹配「..」(正則表達式匹配第一個句點,然後成功完成而不考慮第二個句點)。 – Richard 2009-09-27 08:54:51

+0

真的夠了。答案已更新。 – 2009-09-27 08:57:48

+0

這不會涵蓋字符串包含兩個句點與其他字母之間的情況。 – davidi 2009-09-27 08:57:49

5

無需正則表達式,見str.count()

str.count(sub[, start[, end]])

返回非重疊出現子子的在範圍[開始,結束]的數量。可選參數開始和結束被解釋爲切片符號。

>>> "A.B.C.D".count(".") 
3 
>>> "A/B.C/D".count(".") 
1 
>>> "A/B.C/D".count(".") == 1 
True 
>>> 
0

爲什麼你需要檢查?如果你在一個字符串中有一個數字,我現在猜想你會想很快將它作爲一個數字處理。也許你可以做到這一點沒有尋找你飛躍之前:

try: 
    value = float(input_str) 
except ValueError: 
    ... 
else: 
    ... 
相關問題