仅基于字符串中的子字符串查找整个字符串

2024-05-19 21:56:08 发布

您现在位置:Python中文网/ 问答频道 /正文

这可能是一个重复的问题,在寻找了一点,我找不到答案,因此我张贴的问题。 如何仅基于字符串中的子字符串来查找整个字符串?你知道吗

import re

test = 'INFO: 106.00s - SearchDriver: GET CThru=27.027 OThru=25.566 CErr=0.000 CResp=0.013 OResp=0.011 CSD=0.015 OSD=0.010 C90%Resp=0.025 O90%Resp=0.025'

为了得到CThru=27.027的值,我尝试这样做。你知道吗

re.findall("CThru=*", test)

但它只会回来

['CThru=']

Tags: 字符串答案testimportreinfogetresp
3条回答

*量词总是应用于它放在后面的事物;<regex thing>*意味着<regex thing>应该匹配零次或多次。你知道吗

对于您的尝试,<regex thing>=字符,因此=*表示:零个或多个等于字符。实际上,'CThru='包含一个这样的相等字符,而不是更多。*不会匹配其他任何东西!这与glob syntax不同,后者通常在列出文件时使用,其中*字符本身用于匹配零个或多个文件名字符。正则表达式不是全局模式。你知道吗

如果您想得到=字符后面的值,您需要放入一个模式(regex的东西)来匹配值文本中的字符。由于值始终是而不是空格(空格分隔键=值对)的字符,因此可以使用[^ ]集来表示不是空格,并向其添加+,以确保至少有一个字符。[^...]是一个负集,一个regex“thing”,它将匹配文本中的任何字符,因此[^ ]匹配任何不是空格的字符。+量词表示一个或多个字符,因此我们需要一个或多个不是空格的字符。*+是贪婪的,这意味着正则表达式匹配器将使用尽可能多的字符来满足该模式。你知道吗

如果将(...)圆括号括在该部分周围,则告诉regex引擎捕获该部分并将其放入一个组中,如果只有该组,re.findall()将返回组1中的所有内容。因此只返回CThru=之后的值

re.findall("CThru=([^ ]+)", test)

这将返回任何不属于空格的文本,作为列表:

>>> import re
>>> test = 'INFO: 106.00s - SearchDriver: GET CThru=27.027 OThru=25.566 CErr=0.000 CResp=0.013 OResp=0.011 CSD=0.015 OSD=0.010 C90%Resp=0.025 O90%Resp=0.025'
>>> re.findall("CThru=([^ ]+)", test)
['27.027']

如果只有一个这样的键值对,那么您可以使用re.search(),如果得到的结果不是None,则请求第1组:

match = re.search("CThru=([^ ]+)", test)
if match:
    value = match.group(1)

最后的星号使字符串CThru=变得贪婪(0个或更多匹配项),但它不会搜索其后的任何内容。你知道吗

只要re.findall("CThru=\d*\.\d*", test)后面总是跟着一个浮点数,然后是一个空格,那么沿着re.findall("CThru=\d*\.\d*", test)这条线的一些东西就应该起作用。你知道吗

re.findall("CThru=[^\s]*", test)

效果很好。你知道吗

你需要一些东西在*之前。你知道吗

re.findall("CThru=.*", test)

例如,将从CThru捕获到字符串的末尾。你知道吗

相关问题 更多 >