2013-03-26 178 views
0

我正在使用Python的重新包(是的,我知道正則表達式更一般,但是誰知道,可能有其他包)來讀取一些數據,其中包含帶有變量名的不等式+, - ,>,<或=。 (這是一個不等式體系。)我需要過濾掉變量名稱。使用下劃線的正則表達式匹配

到現在爲止,我用

var_pattern = re.compile(r'[a-z|A-Z]+\d*\.?') 

這是有點「哈克」,因爲它是不是太籠統。我不介意,但遇到了一個奇怪的名字如下所示的問題。

我的下一個走得

var_pattern = re.compile(r'[a-z|A-Z]+[a-zA-Z0-9_.]*') 

它應該,至少一個首字母后,比賽只是除了+,所發生的一切 - ,>,<和=。這適用於'x23'或'C2000001'等變量名稱。但不是'x_w_3_dummy_1'。我原以爲它可能仍然是因爲下劃線,但它似乎工作得很好,變量'x_b_1_0_0'。

有沒有人知道可能會導致什麼,更重要的是,如何解決它?

順便說一句,我也試過

var_pattern = re.compile(r'[a-z|A-Z]+[^+^-^>^<^=]*') 

但無濟於事無論是。

+2

你的變量名也可以用'|'開頭;那是對的嗎?你也不想在變量名中加入'.',是嗎? – 2013-03-26 12:34:01

+0

變量名中是否允許有'.'? – 2013-03-26 12:41:38

+0

Re:'[^ +^- ^>^<^ =]'你只需要開始時使用'^'來表示一個否定的字符集 - 我想你的意思是'[^ + - ><=]' – 2013-03-26 12:49:18

回答

2

你的模式應該只是罰款爲你的榜樣,但糾正你的一個小模式實際匹配你的意圖:

r'[a-zA-Z][a-zA-Z0-9_]*' 

這符合首字母(低於或uppcase),其次是0或更多的字母,數字和下劃線。您的版本包含多餘的+,其中|包含第一個字符所允許的內容,.包含其餘的名稱。

演示展示這一切的樣本相匹配:

>>> import re 
>>> names = ('x23', 'C2000001', 'x_w_3_dummy_1', 'x_b_1_0_0') 
>>> var_pattern = re.compile(r'[a-zA-Z][a-zA-Z0-9_]*') 
>>> for name in names: 
...  print var_pattern.search(name).group() 
... 
x23 
C2000001 
x_w_3_dummy_1 
x_b_1_0_0 

的模式不匹配,可能按照變量名稱的任何+-><=字符:

>>> var_pattern.findall('x23<10\nC2000001=24\nx_w_3_dummy_1+15\nx_b_1_0_0-5') 
['x23', 'C2000001', 'x_w_3_dummy_1', 'x_b_1_0_0'] 
+0

謝謝!我注意到我在那裏很愚蠢......對不起,偷了你的時間,謝謝你的回答! – rubek 2013-03-26 12:41:57

0

應該是:

[a-zA-Z_][a-zA-Z0-9_.]* 
0

除了爲什麼您的原始表達式不適用於您的下劃線之外,您的問題已得到解答。如果您有圖案

r'[a-zA-Z][a-zA-Z0-9_.]*' 

則由於點的它實際上相當於

r'[a-zA-Z].*' 

這樣違揹你的想法,這也同時匹配你的「x_w_3_dummy_1」 你「x_b_1_0_0」 。問題是,由於該點,它也會匹配您的後續分隔符,如您的+, - ,>,<和=以及任何後面的分隔符。