如何在Python的列表理解中使用正则表达式?

如何在Python的列表理解中使用正则表达式?,python,regex,Python,Regex,我试图在一个单词列表中找到字符串的所有索引位置,并希望返回列表中的值。我想查找字符串,如果它是独立的,或者它前面或后面有标点符号,但如果它是一个较大单词的子字符串,则不需要查找 下面的代码只捕获“cow”,并且忽略了“test;cow”和“cow” 我已尝试将代码更改为使用正则表达式: import re myList = ['test;cow', 'one', 'two', 'three', 'cow.', 'cow', 'acow'] myString = 'cow' indices = [

我试图在一个单词列表中找到字符串的所有索引位置,并希望返回列表中的值。我想查找字符串,如果它是独立的,或者它前面或后面有标点符号,但如果它是一个较大单词的子字符串,则不需要查找

下面的代码只捕获“cow”,并且忽略了“test;cow”和“cow”

我已尝试将代码更改为使用正则表达式:

import re
myList = ['test;cow', 'one', 'two', 'three', 'cow.', 'cow', 'acow']
myString = 'cow'
indices = [i for i, x in enumerate(myList) if x == re.match('\W*myString\W*', myList)]
print indices
但这会产生一个错误:预期的字符串或缓冲区

如果有人知道我做错了什么,我会很高兴听到的。我有一种感觉,这与我试图在其中使用正则表达式的事实有关,因为它需要一个字符串。有解决办法吗

我要查找的输出应为:

>> [0, 4, 5]

谢谢

您不需要将
match
的结果分配回
x
。您的匹配项应该在
x
上,而不是
列表上

另外,您需要使用
re.search
而不是
re.match
,因为正则表达式模式
'\W*myString\W*'
将与第一个元素不匹配。那是因为
test
\W*
不匹配。实际上,您只需要测试紧跟在后面和前面的字符,而不需要测试完整的字符串

因此,您可以在字符串周围使用
单词边界

pattern = r'\b' + re.escape(myString) + r'\b'
indices = [i for i, x in enumerate(myList) if re.search(pattern, x)]

您的代码有一些问题。首先,您需要将expr与list元素(
x
)匹配,而不是与整个列表(
myList
)匹配。其次,为了在表达式中插入变量,必须使用
+
(字符串连接)。最后,使用原始文字(
r'\W
)在表达式中正确插入斜杠:

import re
myList = ['test;cow', 'one', 'two', 'three', 'cow.', 'cow', 'acow']
myString = 'cow'
indices = [i for i, x in enumerate(myList) if re.match(r'\W*' + myString + r'\W*', x)]
print indices
如果myString可能包含特殊的regexp字符(如斜杠或点),您还需要对其应用
re.escape

regex = r'\W*' + re.escape(myString) + r'\W*'
indices = [i for i, x in enumerate(myList) if re.match(regex, x)]
正如评论中指出的,以下可能是更好的选择:

regex = r'\b' + re.escape(myString) + r'\b'
indices = [i for i, x in enumerate(myList) if re.search(regex, x)]

也可能添加
re.escape
?@MartijnPieters:当然,添加了。这与OP想要匹配的第一个元素不匹配。另一个问题是正则表达式实际上没有提供OP期望的输出(例如,它不匹配
test;cow
)。我认为
re.search(r'\b'+myString+r'\b',x)
可能会有用。谢谢。我遇到了r'\b*'的问题,它返回了错误“无需重复”,如上面的评论所述。
regex = r'\b' + re.escape(myString) + r'\b'
indices = [i for i, x in enumerate(myList) if re.search(regex, x)]