Python在同一行中搜索多个值

2024-09-28 23:39:52 发布

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

我试图使用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',即它不会独立处理这两个关键字

有人知道吗?提前谢谢


Tags: retxtsearchline关键字resultvariablena
3条回答

这是因为正则表达式匹配的是整个字符串(直到最后一个>>),而不是在Ion1之后第一次出现>>时才匹配。您需要对.*使用lazy运算符来限制匹配

.*?的作用是:它在零次和无限次之间匹配上一个标记,尽可能少地匹配,根据需要进行扩展(惰性)

下面是一个带有解释的示例:https://regex101.com/r/oKyOIn/1

Python重新搜索同一行中的多个值

^{}对于此任务来说是错误的工具,它确实返回第一个(最左侧)匹配项,或者None如果未找到匹配项。您应该使用^{}提供匹配对象的迭代器,或者使用^{}提供list{}或tuple的迭代器

另外,正如前面提到的,您需要更改模式<<ALTER(.*)>>,因为它匹配得太多,您可以使用非贪婪版本,即

<<ALTER(.*?)>>

或者如果>不允许在<<>>线束中使用,则如下所示

<<ALTER([^>]*)>>

您需要在<<ALTER, variable =>>内捕获一个或多个单词字符(字母数字,包括下划线),然后在re.sub方法替换参数中使用可调用的:

Python demo

import re
ParameterDictionary = {'Ion1': 'Na', 'Value1': '1.0'}
line = 'Text1 <<ALTER, variable = Ion1>> Text2 <<ALTER, variable = Value1>>\n'
rx = r'<<ALTER, variable = (\w+)>>'
result = re.sub(rx, lambda x: ParameterDictionary.get(x.group(1), x.group()), line)
print(result)
# => Text1 Na Text2 1.0

这里,

  • <<ALTER, variable = (\w+)>>匹配<<ALTER, variable =,空格,然后(\w+)将任何一个或多个单词字符捕获到组1中,然后>>匹配
  • 匹配项作为x传递到lambda表达式中的re.sub,并且ParameterDictionary.get(x.group(1), x.group())或者通过find键返回相应的值,或者返回整个匹配项(x.group()

相关问题 更多 >