【问题标题】:Advanced string replacements in pythonpython中的高级字符串替换
【发布时间】:2014-11-10 13:15:46
【问题描述】:

我在 python 脚本中有一些字符串,它们看起来像

<tag1> thisIsSomeText <otherTag>, <tag1>!

我想解析这些行,并用字典中的字符串替换每个标签。

假设我的字典看起来像:

tag1: Hello
otherTag: Goodbye

那么输出行应该是这样的:

Hello thisIsSomeText Goodbye, Hello!

正如我们所看到的,标签(及其大括号)被替换了。可能出现多次。

在C语言中,我会搜索'',做一些丑陋的字符串操作...... 但我想,Python 对此有更好的解决方案。

也许是正则表达式?好吧,我希望我的任务足够简单,以至于我可以在没有正则表达式的情况下解决。但我没有计划如何开始使用 Python。有什么建议吗?

【问题讨论】:

标签: python regex string


【解决方案1】:

re.sub 不仅接受字符串,还接受一个函数作为第二个参数的替换。该函数接受一个匹配对象,函数的返回值使用替换字符串。

>>> import re
>>> mapping = {'tag1': 'Hello', 'otherTag': 'Goodbye'}
>>> re.sub(r'<(\w+)>', lambda m: mapping[m.group(1)],
...        '<tag1> thisIsSomeText <otherTag>, <tag1>!')
'Hello thisIsSomeText Goodbye, Hello!'

【讨论】:

  • @falsetrue:我猜你的解决方案比上面的要好。但是,我无法让它开箱即用。所以我最终得到了 greato 的解决方案,因为它正在工作(在修复已知问题之后)......在我写这篇文章时,我想我发现了这个问题。重新分配也是必要的,对吧?
  • @lugge86,您能解释一下我的解决方案是如何不起作用的吗?有什么错误吗?如果有,请与我分享回溯。
  • @lugge86,是的,你需要重新分配。
  • @lugge86,如果字典中没有定义标签,我的回答会引发异常。保留这样的词:根据您的需要使用dict.get 而不是dict[..]lambda m: mapping.get(m.group(1), m.group(0)) or or lambda m: mapping.get(m.group(1), m.group(1))
【解决方案2】:
for i in dictionary.keys():
    string.replace('<'+i+'>',dictionary[i]]

【讨论】:

  • 您不需要使用keys 方法,因为迭代字典会产生键。您需要重新分配替换字符串(str.replace 不会就地替换字符串,而是返回一个新字符串)
  • 如果字典类似于{'a': 'b', 'b': 'a'},这可能会产生不需要的结果。
  • @lugge86, 如果字符串是&lt;&lt;b&gt;&gt; 怎么办?而且这个解决方案有语法错误。正如我评论的那样,str.replace 的返回值应该被分配回去。否则,字符串将保持不变。
  • @falsetru:是的,当然,这段代码中存在语法错误,是的,字符串必须重新分配。我忘了在我的评论中提到这一点,但我在我的脚本中解决了这个问题。所以,它工作正常。关于 > 问题:是的,这可能是个问题。但是,我使用这个脚本来生成 C 源文件和头文件,使用模板文件和 Excel 表。由于模板由我(或周围的其他开发人员)维护,遇到此问题的风险非常低。也许我让脚本搜索 > 然后产生语法错误,或其他什么。
猜你喜欢
  • 2014-11-10
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 2010-09-27
相关资源
最近更新 更多