获取字符串中字符串的特定值

时间:2019-07-15 21:26:21

标签: python regex python-3.x

我有多个定义如下的字符串:

"Conv2D(filters=8, kernel_size=(2, 2), strides=(1,1), padding='valid', data_format='channels_last', activation='relu', use_bias=True, kernel_initializer='zeros', bias_initializer='zeros', kernel_regularizer=regularizers.l1_l2(l1=0.01,l2=0.01), bias_regularizer=regularizers.l1_l2(l1=0.01,l2=0.01), activity_regularizer=regularizers.l1_l2(l1=0.01,l2=0.01), kernel_constraint=max_norm(2.), bias_constraint=max_norm(2.), input_shape=(28,28,1))"

我想在尝试以下操作的字符串中提取kernel_size的值:

match = re.search(i+'(.+?), (.+?) ',value)

其中i = 'kernel_size'和and value是上面定义的字符串。

运行此命令,我得到

<regex.Match object; span=(18, 38), match='kernel_size=(2, 2), '>

我还运行以下命令以使用上述匹配项获取值:

filters = match.group(1).split("=")[1].strip()

但是我明白了:

kernel_size (2

我如何获得这样的东西:

kernel_size (2,2)

2 个答案:

答案 0 :(得分:1)

此表达式可能返回以下内容:

kernel_size\s*=\s*\(\s*(\d+)\s*,\s*(\d+)\s*\)

,我们将使用两个捕获组提取所需的数字,然后将它们组合回我们希望输出的任何格式,例如kernel_size (2,2)

使用re.findall

进行测试
import re

regex = r"kernel_size\s*=\s*\(\s*(\d+)\s*,\s*(\d+)\s*\)"

test_str = ("Conv2D(filters=8, kernel_size=(2, 2), strides=(1,1), padding='valid',\n"
    "Conv2D(filters=8, kernel_size=( 10  , 20 ), strides=(1,1), padding='valid',")

matches = re.findall(regex, test_str, re.IGNORECASE)

for match in matches:
    print('kernel_size ('+ match[0]+','+match[1]+')')

输出

kernel_size (2,2)
kernel_size (10,20)

如果要浏览/简化/修改该表达式,请在this demo的右上角进行解释。

RegEx电路

jex.im可视化正则表达式:

enter image description here

答案 1 :(得分:0)

re比python中的常规字符串操作要慢得多(例如,请参见What's a faster operation, re.match/search or str.find?)。

如果您只需要从字符串中获取1个值,则使用string.find会更快,更简单

s = '<your string>'

pattern = 'kernel_size=('
p = s.find(pattern)
if p != -1:
    p += len(pattern)
    print('kernel_size (%s)' % s[p:s.find(')', p)])