使用文件在已定义列表中查找短语

时间:2017-11-13 10:40:54

标签: python

我有一个名单my= ['cbs is down','abnormal'] 我已经在阅读模式下打开了一个文件

现在我想搜索该文件中存在的列表中的任何字符串并执行if动作

fopen  =  open("test.txt","r")
my =['cbs is down', 'abnormal']
for line in fopen:
    if my in line:
            print ("down")

当我执行它时,我得到以下

Traceback (most recent call last):
  File "E:/python/fileread.py", line 4, in <module>
    if my in line:
TypeError: 'in <string>' requires string as left operand, not list

4 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

if any(i in line for i in my):
    ...

基本上,您正在浏览my并检查其元素的any是否存在。

答案 1 :(得分:1)

fopen  =  open("test.txt","r")
my =['cbs is down', 'abnormal']
for line in fopen:
    for x in my:
        if x in line:
            print ("down")

示例输入

Some text cbs is down
Yes, abnormal
not in my list
cbs is down

输出

down
down
down

答案 2 :(得分:1)

您的错误原因:

以下使用的in运算符:

if my in line: ...
   ^       ^
   |_ left | hand side 
           |
           |_ right hand side

对于右侧的字符串操作数(即line),左侧需要相应的字符串操作数。此操作数一致性检查由str.__contains__方法实现,其中__contains__的调用来自右侧的字符串(请参阅cpython implemenetation)。与:相同:

if line.__contains__(my): ...

然而,您传递了一个列表my,而不是字符串。

解决此问题的一种简单方法是,使用内置any 函数检查列表中任何项目是否包含在当前行中:

for line in fopen:
    if any(item in line for item in my):
       ...

或者,因为您只有两个项目使用or运算符(双关语),短路的方式与any相同:

for line in fopen:
    if 'cbs is down' in line or 'abnormal' in line:
       ...

答案 3 :(得分:0)

您还可以joinmy中的字词\b(cbs is down|abnormal)\b改为re.findall,并使用re.search\b...\b来查找字词。这样,您还可以将图案括在单词边界>>> import re >>> my = ['cbs is down', 'abnormal'] >>> line = "notacbs is downright abnormal" >>> p = re.compile(r"\b(" + "|".join(map(re.escape, my)) + r")\b") >>> p.findall(line) ['abnormal'] >>> p.search(line).span() (21, 29) 中,使其与较长单词的部分不匹配,并且您还会看到哪个术语匹配,以及在哪里。

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /your/path/here/
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]    
</IfModule>