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

python中的正则表达式-需要帮助,python,regex,Python,Regex,像许多在这里发帖的人一样,我最近开始用Python编程。 我在试图定义正则表达式以从字符串中提取变量名(我在列表中保存了一个变量名列表)时遇到了一个问题。 我正在解析从文件中逐行提取的部分代码。 我列出了一个变量列表: >>> variable_list = ['var1', 'var2', 'var4_more', 'var3', 'var1_more'] 我想做的是定义re.compile,它不会说它找到了两个var1;我想做一个精确的匹配。根据上面的例子,var不应该匹

像许多在这里发帖的人一样,我最近开始用Python编程。 我在试图定义正则表达式以从字符串中提取变量名(我在列表中保存了一个变量名列表)时遇到了一个问题。 我正在解析从文件中逐行提取的部分代码。 我列出了一个变量列表:

>>> variable_list = ['var1', 'var2', 'var4_more', 'var3', 'var1_more']
我想做的是定义
re.compile
,它不会说它找到了两个
var1
;我想做一个精确的匹配。根据上面的例子,
var
不应该匹配任何内容,
var1
应该只匹配列表的第一个元素

我假设答案可能是将正则表达式与其他正则表达式的否定结合起来,但我不确定如何解决这个问题

好的,我注意到我错过了一件重要的事情。变量列表是从一个字符串中收集的,因此可以在变量名之前有一个空格,或者在变量名之后有一个符号。 更准确的变量列表如下

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

在这种情况下,它应该识别前3个变量,而不是最后一个变量1

听起来你只需要用
^
$
来修改正则表达式,除非我没有正确理解你:

>>> 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\u 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)']
如果希望变量的名称不包含无关内容,则可以捕获它并提取第一个捕获组。可能是这样的(可能有点低效,因为正则表达式在匹配项上运行了两次):


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

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

不要在ReGEX匹配上扩展太多,但是您可以考虑使用“过滤器()”内置:

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']

更多的代码和/或解释将是有用的。不清楚“提取变量名”是什么意思。您想为每个变量创建一个单独的正则表达式,事先知道变量名,还是想要一个与任何变量名匹配的re?这些字符串中是否有其他内容(例如:它们是表达式)或者它们只是要检查有效性的变量名?我想做一些类似于重新编译(“(someregex)%s(someregex)”,variable)的事情,其中变量应该是已知变量列表中的一个,例如已知的变量=['var1',var2',var1\u more']使用for variable in known_variables:请正确设置代码格式。我对问题进行了一些编辑,但到目前为止,这正是我需要它做的工作,因为我首先提出了一个问题。问题是,我从一个文件中列出了一个列表,但我不确定这些行的格式。在您的示例中,根据我的需要,“var1”和“var1”都应该为true。
>>> filter(lambda x: not r.match(x), mylist)
['var2', 'var3_something', 'var1_text', 'var1var1']