Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在列表中查找字符串_Python_Regex - Fatal编程技术网

Python在列表中查找字符串

Python在列表中查找字符串,python,regex,Python,Regex,我有一个salt模块,它返回以下输出,并将所有这些存储到一个列表中,以使迭代更容易: - 2015-05-21 19:25:08,060 [main] WARN [::::::] c.p.core.FilteringPropertyPlaceholderConfigurer - Could not load properties from class path resource [proferi-component-test.properties]: class path resour

我有一个salt模块,它返回以下输出,并将所有这些存储到一个列表中,以使迭代更容易:

    - 2015-05-21 19:25:08,060 [main] WARN  [::::::] c.p.core.FilteringPropertyPlaceholderConfigurer - Could not load properties from class path resource [proferi-component-test.properties]: class path resource [proferi-component-test.properties] cannot be opened because it does not exist
    - 2015-05-21 19:25:08,064 [main] WARN  [::::::] c.p.core.FilteringPropertyPlaceholderConfigurer - Could not load properties from class path resource [qe-prop-not-specified]: class path resource [qe-prop-not-specified] cannot be opened because it does not exist
    - 2015-05-21 19:25:13,290 [main] INFO  [::::::] c.p.a.m.persistence.modular.ModelSessionManager - Setup SessionManager modelSessionFactory
    - 2015-05-21 19:25:14,327 [main] INFO  [::::::] c.p.a.model.persistence.BlueprintsGraphReadSession - Loading model graph for application M-00000304-0000-0001-0000-000000000000 with version MV-0000000000002714-0000000000002695-true
    - 2015-05-21 19:25:14,658 [main] INFO  [::::::] c.p.a.m.p.hydration.AppModelGraphHydrator - AppModelGraph Hydration stats for app M-00000304-0000-0001-0000-000000000000 - total time:322ms | sql time:20ms | jackson mapping:32ms | vertex adding:6ms | core building:63ms | core population:15ms | proxying:84ms | invocation handler creation:80ms | interface list building:10ms | moving through result set:4ms | items processed:156
    - 2015-05-21 19:25:14,860 [main] INFO  [-:sales02:Session:SetPasswd:-:-:-] c.l.n.cluster.zookeeper.ZooKeeperClusterClient - Starting ClusterClient...
    - 2015-05-21 19:25:14,914 [main] INFO  [-:sales02:Session:SetPasswd:-:-:-] c.l.n.cluster.zookeeper.ZooKeeperClusterClient - Cluster started
    - 2015-05-21 19:25:14,915 [main] INFO  [-:sales02:Session:SetPasswd:-:-:-] com.proferi.core.NorbertProtobufServiceClient - Constructing NettyNetworkClient with close channel time -1 ms, max cnxns per node 10, stale request timeout 20 minutes, stale request purge frequency 2 minutes
    - 2015-05-21 19:25:14,961 [Thread-8] INFO  [-:sales02:Session:SetPasswd:-:-:-] c.l.n.c.zookeeper.ZooKeeperClusterManagerComponent - Connected to ZooKeeper
    - 2015-05-21 19:25:14,987 [Thread-8] INFO  [-:sales02:Session:SetPasswd:-:-:-] c.l.n.c.zookeeper.ZooKeeperClusterManagerComponent - Handling a Connected message
    - 2015-05-21 19:25:15,245 [main] INFO  [-:sales02:Session:SetPasswd:-:-:-] com.company.platform.cli.SetPassword - Password for email address john@tech.com for tenant sales02 was set
    - 2015-05-21 19:25:15,254 [main] INFO  [-:-:-:-:-:-:-] c.l.norbert.network.netty.NettyNetworkClient - Shutting down NetworkClient
    - 2015-05-21 19:25:15,273 [main] INFO  [-:-:-:-:-:-:-] c.l.norbert.network.netty.NettyNetworkClient - NetworkClient shut down
    - 2015-05-21 19:25:15,281 [main] INFO  [-:-:-:-:-:-:-] c.l.n.cluster.zookeeper.ZooKeeperClusterClient - Cluster shut down
从这个返回中,我想检查块是否有字符串

- 2015-05-21 19:05:18,108 [main] INFO  [-:sales02:Session:SetPasswd:-:-:-] com.company.platform.cli.SetPassword - Password for email address john@tech.com for tenant sales02 was set
最好的方法是什么

我试着使用for循环-

但这力的工作还是假的。我尝试使用正则表达式,但字符串太复杂,我无法得出正则表达式公式。任何帮助都将不胜感激


由于这是一个列表,我知道我可以使用索引来获取所需的字符串,但我不想要该字符串,我想在那里检查它,然后将自定义字符串返回给用户。

一个更简单的方法是使用以下内容:

if s in l:
    return True
不需要像这样进行简单检查的for循环,它将在列表上迭代并返回正值,或者在匹配时返回任何您想要返回的值。这也是在python脚本的CLI级菜单中构建一些健壮性的一种方法

提示:您可能希望将要检查的字符串列表更改为一个集合。跑得稍微快一点

编辑:更好的方法:

return s in l
如果你一心想使用for循环-


虽然这可能是一个不太优雅的解决方案,但使用any确实允许您进行比上述简单理解更柔和的匹配-然而,这是有风险的,因为如果列表中的字符串至少包含您的匹配条件字符串以及更多信息,那么它也将返回true

一种更简单的方法是使用以下方法:

if s in l:
    return True
不需要像这样进行简单检查的for循环,它将在列表上迭代并返回正值,或者在匹配时返回任何您想要返回的值。这也是在python脚本的CLI级菜单中构建一些健壮性的一种方法

提示:您可能希望将要检查的字符串列表更改为一个集合。跑得稍微快一点

编辑:更好的方法:

return s in l
如果你一心想使用for循环-


虽然这可能是一个不太优雅的解决方案,但使用any确实允许您进行比上述简单理解更柔和的匹配-然而,这是有风险的,因为如果列表中的字符串至少包含您的匹配条件字符串以及更多信息,那么它也将返回true

如果您希望真正使用正则表达式,可以尝试以下方法。它可能没有简单地遍历列表那么有效,但它可能会让您了解如何实现它

虽然正则表达式的文字匹配既复杂又混乱,但它允许您通过匹配组获取日志的每个组件。在真实的环境中,您可能想看看使用Grok过滤器的东西,了解它们,它们非常有趣

注意:下面的正则表达式不是100%精确的,并且可能需要在提供更多数据的情况下进行修改,但是您知道了

所需行的文字匹配如下所示:

-\s(\d{4}-\d{1,2}-\d{1,2})\s(\d{1,2}:\d{1,2}:\d{1,2},\d{1,3})\s(\[\w+\])\s(\w+)\s+(\[.*\])\s([a-zA-Z.]+)\s-\s(.*)
要仅使邮件成为匹配组,请执行以下操作:

(?:.*)\s(([a-zA-Z_$][a-zA-Z\d_$]*\.)*([a-zA-Z_$][a-zA-Z\d_$]+)\s-\s)(.*)
例如,我将不使用列表,而是使用字符串来演示:

import re

logLine = "- 2015-05-21 19:05:18,108 [main] INFO  [-:sales02:Session:SetPasswd:-:-:-] com.company.platform.cli.SetPassword - Password for email address john@tech.com for tenant sales02 was set"
rx = "-\s(\d{4}-\d{1,2}-\d{1,2})\s(\d{1,2}:\d{1,2}:\d{1,2},\d{1,3})\s(\[\w+\])\s(\w+)\s+(\[.*\])\s([a-zA-Z.]+)\s-\s(.*)"

reMatch = re.match(rx, logLine)

if (reMatch):
    print reMatch.group(1)
    # Groups 1-7
您可以迭代匹配组,您将看到这样的日志行将为您提供:

2015-05-21 19:05:18,108 [主要] 信息 [-:sales02:Session:SetPasswd:-:-:-] com.company.platform.cli.SetPassword 电子邮件地址的密码john@tech.com为租户sales02设置了 因此,您可以检查match group 7以查看消息中所需的字符串是否存在,或者简单地使用第二个正则表达式替换为只检查一个组:

reMatch2 = re.match(rx2, logLine)

if (reMatch2):
    print reMatch2.group(1)

使用缩短的正则表达式也会得到类似的结果,但它可能会让您在将来对日志做更多的工作,而不仅仅是在需要时确定行中是否存在某些内容或行本身是否存在。

如果您希望真正使用正则表达式,您可以尝试以下方法。它可能没有简单地遍历列表那么有效,但它可能会让您了解如何实现它

虽然正则表达式的文字匹配既复杂又混乱,但它允许您通过匹配组获取日志的每个组件。在真实的环境中,您可能想看看使用Grok过滤器的东西,了解它们,它们非常有趣

注意:下面的正则表达式不是100%精确的,并且可能需要在提供更多数据的情况下进行修改,但是您知道了

所需行的文字匹配如下所示:

-\s(\d{4}-\d{1,2}-\d{1,2})\s(\d{1,2}:\d{1,2}:\d{1,2},\d{1,3})\s(\[\w+\])\s(\w+)\s+(\[.*\])\s([a-zA-Z.]+)\s-\s(.*)
要仅使邮件成为匹配组,请执行以下操作:

(?:.*)\s(([a-zA-Z_$][a-zA-Z\d_$]*\.)*([a-zA-Z_$][a-zA-Z\d_$]+)\s-\s)(.*)
例如,我将不使用列表,而是使用字符串来演示:

import re

logLine = "- 2015-05-21 19:05:18,108 [main] INFO  [-:sales02:Session:SetPasswd:-:-:-] com.company.platform.cli.SetPassword - Password for email address john@tech.com for tenant sales02 was set"
rx = "-\s(\d{4}-\d{1,2}-\d{1,2})\s(\d{1,2}:\d{1,2}:\d{1,2},\d{1,3})\s(\[\w+\])\s(\w+)\s+(\[.*\])\s([a-zA-Z.]+)\s-\s(.*)"

reMatch = re.match(rx, logLine)

if (reMatch):
    print reMatch.group(1)
    # Groups 1-7
您可以迭代匹配组,您将看到这样的日志行将为您提供:

2015-05-21 19:05:18,108 [主要] 信息 [-:sales02:Session:SetPasswd:-:-:-] com.company.platform.cli.SetPassword 电子邮件地址的密码john@tech.com为租户sales02设置了 因此,您可以检查匹配组7,查看消息中所需的字符串是否存在,或者只需替换为th e第二个正则表达式,以仅检查一个组:

reMatch2 = re.match(rx2, logLine)

if (reMatch2):
    print reMatch2.group(1)

使用缩短的正则表达式也会得到类似的结果,但它可能会让您在将来对日志做更多的工作,而不仅仅是在需要时确定某行中是否存在某些内容或该行本身是否存在。

什么是说它不起作用?永远不会返回真值?我编辑了那个部分。为什么不检查一些唯一的关键字呢?您是否试图找到与目标字符串100%匹配的字符串?它不起作用是什么意思?永远不会返回真值?我编辑了那个部分。为什么不检查一些唯一的关键字呢?你想找到100%匹配你的目标字符串吗?我试过了,但没用。我想这是因为第一个元素将返回False,而函数存在。@我刚才看到你评论它不工作,然后在两秒钟后接受答案。嗯?逻辑是对的,我这边的实现有一个错误。我确实试过了,但没用。我想这是因为第一个元素将返回False,而函数存在。@我刚才看到你评论它不工作,然后在两秒钟后接受答案。嗯?逻辑是对的,我这边的执行有一个错误。