这可能是一个重复性的问题,经过一番搜索后,我找不到答案,因此我发布了该问题。 如何仅基于字符串中的子字符串找到整个字符串?
<?php
$employee = get_field('employee');
if( $employee ) {
$post = $employee;
setup_postdata( $post );
// At this point you can pull any data from the employee post that you need.
wp_reset_postdata(); // Make sure to reset postdata when you're done.
}
?>
要获取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)
答案 0 :(得分:2)
*
量化符始终应用于放置在其后的对象; <regex thing>*
表示<regex thing>
应该匹配零次或多次。
对于您的尝试,<regex thing>
是=
字符,因此=*
的意思是:零个或多个等于字符。实际上,'CThru='
包含一个相同的字符,仅此而已。 *
与其他任何内容都不匹配!这与glob syntax不同,Cropping2D通常在列出文件时使用,其中{em> just *
字符本身用于匹配零个或多个文件名字符。正则表达式不是全局模式。
如果要在=
字符后获取值 ,则需要放入一个模式(正则表达式)以匹配值文本中的字符。由于值始终是不是空格的字符(空格分隔键=值对),因此可以使用[^ ]
设置为说不是空格和为此添加+
,以确保至少有一个字符。 [^...]
是一个负数集,它是一个正则表达式'thing',它将匹配集合中 not 中文本的任何字符,因此{{1} }匹配不是空格的任何字符。 [^ ]
量词表示一个个或多个字符,因此我们需要1个或多个非空格字符。 +
和*
是 greedy ,这意味着正则表达式匹配器将使用尽可能多的字符来满足该模式。
如果您在该部分周围加上+
括号,则告诉正则表达式引擎捕获该部分并将其放入组中,如果只有该组,(...)
将返回组1中的所有内容。因此,返回re.findall()
之后的只是值:
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']
,并询问第1组,是否得出的结果不是re.search()
:
None
答案 1 :(得分:0)
最后的星号使字符串CThru=
处于贪婪状态(匹配0个或更多),但之后不搜索任何内容。
只要re.findall("CThru=\d*\.\d*", test)
后面总是跟随一个浮点数然后是一个空格,那么应该遵循CThru=
的用法。
答案 2 :(得分:0)
re.findall("CThru=[^\s]*", test)
效果很好。
您需要在*之前添加一些内容。
re.findall("CThru=.*", test)
例如,将从CThru捕获到字符串的结尾。