像许多其他人在这里发帖一样,我最近开始用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 :(得分: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_text
或var1var1
匹配。这就是你要追求的吗?
我认为处理编辑的一种方法是使用^\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']