我有多个定义如下的字符串:
"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)
答案 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的右上角进行解释。
jex.im可视化正则表达式:
答案 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)])