如何获取列表中多个单词的位置

时间:2015-11-28 21:15:27

标签: python-2.7

import re
word = input("Type a word")
sentence = ['example',ahhu','example']
Positions = [m.start() for m in re.finditer(word, sentence)]
print(Positions)

输出

Positions = [m.start() for m in re.finditer(word, sentence)]

  File "C:\Python34\lib\re.py", line 219, in finditer
    return _compile(pattern, flags).finditer(string)
TypeError: expected string or buffer

3 个答案:

答案 0 :(得分:2)

re.finditer()需要一个字符串/缓冲区作为第二个参数,但会传递一个列表,引发此异常。

修改 如果您只想获得sentence列表中等于word的元素的位置,您也可以这样做:

>>> sentence = ['example', 'spam', 'egg', 'bacon', 'spam', 'spam']
>>> word = 'spam'
>>> positions = [i for i, string in enumerate(sentence) if string == word]
>>> positions
[1, 4, 5]

如果用字符串替换sentence,您的示例将有效。请注意,在这种情况下,word实际上是一个正则表达式模式:

>>> sentence = "example spam egg example spam spam"
>>> import re
>>> word = 'spam'
>>> positions = [m.start() for m in re.finditer(word, sentence)]
>>> print(positions)
[8, 25, 30]

答案 1 :(得分:1)

编辑:触发此错误是因为列表作为第二个参数传递给finditer()方法而不是字符串,(请参阅Zormos' s回答)。但是,这不是代码的唯一问题(见下文)。

这确实是Python2.7吗?如果是这样,您应该将input()更改为raw_input(),因为Python2.x中的前者会尝试将输入评估为Python表达式。

如果你巧合的话,输入一些例如有效的变量名称word不是字符串,而是对该变量的引用。

演示(使用Python2.7):

>>> abc = 123
>>> word = input("Enter a word: ")
Enter a word: abc
>>> print word
123
>>> word == abc
True
>>> type(word)
<type 'int'>
>>> import re
>>> re.finditer(word, ['one', 'two', 'three'])
...
TypeError: first argument must be string or compiled pattern

答案 2 :(得分:1)

这是使用finditer的方法:

import re

string="This is an example. ahhu example"
pattern="example"

for match in re.finditer(pattern,string):
    print "%s: %s" % (match.start(), match.group())