2011-10-28 7 views
1

像許多其他人在這裏發帖一樣,我最近開始用Python進行編程。 我遇到了一個問題,試圖定義正則表達式來從字符串中提取一個變量名稱(我有一個保存在列表中的變量名稱列表)。 我解析了我從文件中逐行讀取的部分代碼。 我做的變量列表,:Python中的正則表達式 - 需要幫助

>>> variable_list = ['var1', 'var2', 'var4_more', 'var3', 'var1_more'] 

我想要做的就是定義re.compile的東西,也不會說,它發現了兩個var1;我想做一個完全匹配。根據上面的示例,var應該不匹配,var1應該只匹配列表的第一個元素。

我認爲答案可能是結合正則表達式與其他正則表達式的否定,但我不知道如何解決這個問題。

好的,我注意到我錯過了一件重要的事情。變量列表是從一個字符串中收集的,因此可能在var名稱前面有空格,或者在後面簽名。 更準確variable_list會像

>>> variable_list = [' var1;', 'var1 ;', 'var1)', 'var1_more'] 

在這種情況下,應該認識到前3,但不是最後一個作爲VAR1。

+0

更多代碼和/或解釋將是有用的。目前還不清楚「提取變量名稱」的含義。你想爲每個知道變量名的變量預先創建一個單獨的正則表達式,還是你想要一個匹配任何變量名的re?這些字符串中是否還有其他內容(例如:它們是表達式)還是隻是您想檢查有效性的變量名稱? –

+0

我想做一些類似於製作re.compile(「(someregex)%s(someregex)」,變量)的地方,其中變量應該是已知變量列表中的一個,例如known_variables = ['var1','var2', 'var1_more']用於變量known_variables: – petrovic

+0

_請正確格式化您的代碼。 – agf

回答

2

這聽起來像你只需要^$anchor您正則表達式,除非我不理解你正確:

>>> mylist = ['var1', 'var2', 'var3_something', 'var1_text', 'var1var1'] 
>>> import re 
>>> r = re.compile(r'^var1$') 
>>> matches = [item for item in mylist if r.match(item)] 
>>> print matches 
['var1'] 

所以^var1$將完全匹配var1,但不var1_textvar1var1。那是你的追求?


我想處理您的編輯將與^\W*var1\W*$(其中var1是你想要的變量名)的一種方式。 \W簡寫character class匹配任何不在\w類中的和\w在Python中基本上都是字母數字字符加下劃線。 *表示這可能匹配零次或多次。結果如下:

variable_list = [' var1;', 'var1 ;', 'var1)', 'var1_more'] 
>>> r = re.compile(r'^\W*var1\W*$') 
>>> matches = [item for item in variable_list if r.match(item)] 
>>> print matches 
[' var1;', 'var1 ;', 'var1)'] 

如果你想要的變量名稱沒有多餘的東西,那麼你可以捕獲它並提取第一個捕獲組。像這樣的事情,也許(可能有點自正則表達式的低效上匹配的項目運行兩次):

>>> r = re.compile(r'^\W*(var1)\W*$') 
>>> matches = [r.match(item).group(1) for item in variable_list if r.match(item)] 
>>> print matches 
['var1', 'var1', 'var1'] 
+0

我已經編輯了一下這個問題,但到目前爲止,這是我需要它做的工作,因爲我首先提出了這個問題。 – petrovic

+0

@petrovic:我已經添加了關於第二個示例的編輯。 – eldarerathis

+0

謝謝,這將解決問題。 :) – petrovic

0

如果你想了解正則表達式,那麼也許這是一個有用的拼圖,但如果你想看到某個單詞是否在單詞的列表,爲什麼不這樣:

>>> 'var1' in mylist 
True 
>>> 'var1 ' in mylist 
False 
+0

這個問題是我從一個文件中創建了一個列表,我不確定這些行的格式。在你的例子中,'var1'和'var1'應該是真實的,根據我的需要。 – petrovic

0

不擴大對正則表達式匹配得多得多,但你可以考慮使用「過濾器()」內置:

filter(function, iterable) 

所以,使用@eldarerathis建議的正則表達式的之一:

>>> mylist = ['var1', 'var2', 'var3_something', 'var1_text', 'var1var1'] 
>>> import re 
>>> r = re.compile(r'^var1$') 

>>> matches = filter(r.match, mylist) 
['var1'] 

或使用自己的匹配功能:

>>> def matcher(value): 
>>>  ... match statement ... 

>>> filter(matcher, mylist) 
['var1'] 

或者是lambda早些時候否定的正則表達式:

>>> filter(lambda x: not r.match(x), mylist) 
['var2', 'var3_something', 'var1_text', 'var1var1']