如何用元组列表替换列表中正则表达式匹配的模式?

Posted

技术标签:

【中文标题】如何用元组列表替换列表中正则表达式匹配的模式?【英文标题】:How to replace a pattern matched by regex in a list with a list of tuples? 【发布时间】:2020-01-17 17:09:11 【问题描述】:

我有一个文本文件,我已将其处理为与特定模式匹配的行列表中的字符串。我想用列表中的元组替换该行的匹配部分

 D= ['M2 (net23 Vin\\- net20 0) nmos1',
     'M1 (net19 Vin\\+ net20 0) nmos1', 
     'M7 (vout\\- net29 0 0) nmos1',
     'M5 (net20 net29 0 0) nmos1' ,
     'NM4 (net29 net29 0 0) nmos1',
     'NM3 (net22 net29 0 0) nmos1' ]

我写了一个生成过程

k = [('breach', 'Vin\\-', 'net20', '0'),
     ('net19', 'Vin\\+', 'net20', '0'),
     ('vout\\-', 'net29', '0', '0'),
     ('net20', 'net29', '0', '0'),
     ('net29', 'net29', '0', '0'),
     ('net22', 'net29', '0', '0')]

我需要输出是

['M2 (breach Vin\\- net20 0) nmos1',
 'M1 (net19 Vin\\+ net20 0) nmos1', 
 'M7 (vout\\- net29 0 0) nmos1',
 'M5 (net20 net29 0 0) nmos1',
 'NM4 (net29 net29 0 0) nmos1',
 'NM3 (net22 net29 0 0) nmos1' ]

我可以手动执行此操作,但我想对内部的所有节点执行此操作,一次一个。

我试过了

cmos_regex_pattern = re.compile('(.*) (\(.*\)) (nmos1|pmos1) ((.*))')
for line in D:
   data = cmos_regex_pattern.search(line)
   if data:
       re.sub(cmos_regex_pattern,str(k),data.group(2))

到目前为止,它什么也没做。

另一件事,我累了

    regex_pattern = re.compile('(.*) (\(.*\)) (nmos1|pmos1) ((.*))')
    for i in range(len(D)):
         find = D[i]
         #print(find)
         replace = k[i]
         #print(replace)
         for line in D:
         print (line)
         new_line = regex_pattern.sub(find,replace,line)

但它出现了一个错误 TypeError: 'str' 对象不能被解释为位置换行处的整数。

【问题讨论】:

Total_Mos_device 中显示的内容不是有效的 Python 语法,请edit 提出问题并解决此问题。我们需要看到minimal reproducible example。 感谢您指出我的示例中的错误。我已将其更改为可重复性最低的示例。 【参考方案1】:

第一次尝试:

如果您在调试器中查看str(k),您会发现这不是k 的单行,而是整个数组的字符串表示形式,请参见str。 在正则表达式中,只匹配要替换的文本部分,见re.sub。

第二次尝试:

您正在传递一个元组作为替换,它应该是一个字符串或一个函数(参见下面示例中的join)。

以下示例使用zip 迭代D/k 组合。如果您的数据不如所示示例中的统一,您可能需要对此进行调整。

result = []
cmos_regex_pattern = re.compile('(\(.*\))') # the pattern that matches the text which should be replaced
for k_data, line in zip(k, D):
    k_str = "(" + " ".join(k_data) + ")" # the text which replaces the matched text
    result.append(re.sub(cmos_regex_pattern, k_str, line)) # perform the replacement in the current line, and add the result to the 'result' array

【讨论】:

以上是关于如何用元组列表替换列表中正则表达式匹配的模式?的主要内容,如果未能解决你的问题,请参考以下文章

re模块,分组在re模块中的使用,使用正则表达式的技巧,爬虫实例

JS如何用正则表达式 获取字符串内的匹配部份?

如何用正则表达式匹配连字符?

MySQL之正则表达式(REGEXP)

如何用正则表达式获取cookie

如何用模式(正则表达式)替换字符串的一部分在数据框中抛出行