python中的正则表达式 - 需要帮助

时间:2011-10-28 16:17:34

标签: python regex

像许多其他人在这里发帖一样,我最近开始用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。

3 个答案:

答案 0 :(得分: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类中没有的任何内容,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']

答案 1 :(得分:0)

如果您正在尝试了解正则表达式,那么这可能是一个有用的谜题,但如果您想查看单词列表中是否有某个单词,为什么不这样:

>>> 'var1' in mylist
True
>>> 'var1 ' in mylist
False

答案 2 :(得分:0)

不要在正则表达式匹配上进一步扩展,但你可以考虑使用内置的'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']
相关问题