2012-09-13 25 views
0

我正在編寫腳本來解析文本文件(csv是精確的),我想根據每行內容從文件中選擇行。有很多字符串條件需要檢查,所以我推測正則表達式是要走的路,但我還需要檢查一行中的數字是否與模運算的條件相符,到目前爲止它是n%4==kn%2==k。但似乎只有臨時解決方案。 n%2==k是非常簡單的,但檢查n%4==2我不得不想出這樣的事情:使用正則表達式檢查模算術條件

r'((^\d*[24680]|^)[26]|^\d*[13579][048])[\s;,].*' # more (unrelated) conditions follow 

我的問題是:

  1. 有沒有一種方法來簡化上述正則表達式?它有什麼明顯的問題嗎?
  2. 如果我想將腳本推廣到其他模數條件(例如n%3==kn%7==k),是否有一種可行的方法來使用正則表達式,或者我最好從字符串中提取一個數字並編寫額外的代碼來檢查這些條件。
+0

您是否試過'n%\ d + ==(?: k | \ d +)'?它匹配'n%(數字)==(K或數字)'。 – Blender

+2

我很害怕因爲不得不對此進行調試。請考慮使用['csv'](http://docs.python.org/library/csv.html)並轉換爲整數。 –

+1

你似乎找到了一把錘子,但模數條件是* not *指甲。爲什麼不把它們轉換成整數並且以這種方式測試它們的價值? –

回答

0

這似乎是n%4==2(參考:http://en.wikipedia.org/wiki/Divisibility_rule)更準確

r = r'^[26]$|^\d*[02468][26]$|^\d*[13579][048]$' 

# test 
for i in xrange(1, 1000): 
    m = re.match(r, str(i)) 
    if i % 4 == 2: 
     assert m, [i, i % 4] 
    else: 
     assert not m, i 

n%3==0看到Regex filter numbers divisible by 3。 我不知道mod n的任何通用解決方案,無論如何這將是一個有趣的,但純粹的理論練習。在現實生活中,只需使用整數。

+0

謝謝,這是更清潔。是的,mod 3或7當然更理論。 –