[英]Regular expression in python - help needed
像許多其他在這里發表問題的人一樣,我最近開始使用Python進行編程。 我在嘗試定義正則表達式以從字符串中提取變量名(我在列表中保存了變量名的列表)時遇到了問題。 我正在解析從文件中逐行獲取的部分代碼。 我列出了變量:
>>> variable_list = ['var1', 'var2', 'var4_more', 'var3', 'var1_more']
我想做的是用不會說找到兩個var1
東西定義re.compile
; 我想精確匹配。 根據上面的示例, var
應該不匹配任何內容, var1
應該僅匹配列表的第一個元素。
我想答案可能是將正則表達式與否定其他正則表達式相結合,但是我不確定如何解決此問題。
好的,我注意到我錯過了一件重要的事情。 變量列表是從字符串中收集的,因此可以在var名稱前留一個空格,或在其后留一個空格。 更准確的variable_list類似於
>>> variable_list = [' var1;', 'var1 ;', 'var1)', 'var1_more']
在這種情況下,它應該將前3個而不是最后一個識別為var1。
聽起來您只需要用^
和$
來固定正則表達式,除非我對您的理解不正確:
>>> 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_text
或var1var1
。 那是你追求的嗎?
我想一種處理您的編輯的方法是使用^\\W*var1\\W*$
(其中var1
是您想要的變量名)。 \\W
速記字符類與\\w
類中不存在的任何內容匹配,而Python中的\\w
基本上是字母數字字符加下划線。 *
表示可以匹配零次或多次。 結果是:
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']
如果您想學習正則表達式,那么這可能是一個有用的難題,但是如果您想查看某個單詞是否在單詞列表中,為什么不這樣做:
>>> 'var1' in mylist
True
>>> 'var1 ' in mylist
False
不要在正則表達式匹配上擴展太多,但是您可以考慮使用內置的'filter()':
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']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.