我试图使用re.search(或re.findall)解释一行,并通过一个值更改关键字
我的示例字符串是:
line = 'Text1 <<ALTER, variable = Ion1>> Text2 <<ALTER, variable = Value1>>\n'
使用'Na'的Ion1
值和1.0的Value1
值,我希望返回
processedline = 'Text1 Na Text2 1.0'
为此,我尝试了以下代码:
result = re.search('<<ALTER(.*)>>', line)
aux_txt = result.group(1).split('=')
var = aux_txt[-1].strip()
value = ParameterDictionary[var]
processedline = re.sub('<<ALTER(.*)>>', str(value), line, flags=re.DOTALL)
但是,对于变量result
,我得到的返回是', variable = Ion1>> Text2 <<ALTER, variable = Value1'
,即它不会独立处理这两个关键字
有人知道吗?提前谢谢
这是因为正则表达式匹配的是整个字符串(直到最后一个
>>
),而不是在Ion1
之后第一次出现>>
时才匹配。您需要对.*
使用lazy
运算符来限制匹配.*?
的作用是:它在零次和无限次之间匹配上一个标记,尽可能少地匹配,根据需要进行扩展(惰性)下面是一个带有解释的示例:https://regex101.com/r/oKyOIn/1
Python重新搜索同一行中的多个值
^{} 对于此任务来说是错误的工具,它确实返回第一个(最左侧)匹配项,或者} 提供匹配对象的迭代器,或者使用^{} 提供}或
None
如果未找到匹配项。您应该使用^{list
{tuple
的迭代器另外,正如前面提到的,您需要更改模式
<<ALTER(.*)>>
,因为它匹配得太多,您可以使用非贪婪版本,即或者如果
>
不允许在<<
和>>
线束中使用,则如下所示您需要在
<<ALTER, variable =
和>>
内捕获一个或多个单词字符(字母数字,包括下划线),然后在re.sub
方法替换参数中使用可调用的:见Python demo:
这里,
<<ALTER, variable = (\w+)>>
匹配<<ALTER, variable =
,空格,然后(\w+)
将任何一个或多个单词字符捕获到组1中,然后>>
匹配x
传递到lambda表达式中的re.sub
,并且ParameterDictionary.get(x.group(1), x.group())
或者通过find键返回相应的值,或者返回整个匹配项(x.group()
)李>相关问题 更多 >
编程相关推荐