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
答案 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())