簡體   English   中英

python中的正則表達式-需要幫助

[英]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_textvar1var1 那是你追求的嗎?


我想一種處理您的編輯的方法是使用^\\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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM