使用Python替换正则表达式匹配中的非字母数字字符

时间:2017-08-04 15:19:35

标签: python regex string replace verilog

我有一个文本文件(verilog),其中包含我想要修改的某些字符串序列(转义标识符)。在下面的示例中,我想找到以' \'开头的任何群组。并以'结尾' (任何可打印的字符都可以介于两者之间)。在找到符合此条件的组后,我想用字母数字字符替换所有非字母数字字符(我不太关心它们被替换的字母数字)。

In[1]:  here i$ \$0me text to \m*dify
Out[1]: here i$ aame text to madify

我找到需要使用正则表达式替换的组是没有问题的。但是,如果我只使用re.findAll(),则在修改匹配的组后,我不再拥有字符串中单词的位置来重建字符串。

有没有办法在单独修改每个匹配时保留字符串中单词的位置?

注意:我之前曾问过一个非常类似的问题here,但我过于简化了我的例子。我认为编辑我现有的问题会使现有的评论和答案对未来的读者感到困惑。

1 个答案:

答案 0 :(得分:1)

我对您之前的问题的回答仍然适用,只做了一些小的修改。只有正则表达式发生了变化。

由于这更复杂,因此定义一个函数作为回调传递。

In [57]: def foo(m):
    ...:     return ''.join(x if re.match('[a-zA-Z]', x)\
                              else ('' if x == '\\' else 'a') for x in m.group()) 

现在,请致电re.sub

In [58]: re.sub(r'\\.*?(?= |$)', foo, text)
Out[58]: 'here i$ aame text to madify'